类型和指针地址

时间:2016-06-12 03:35:39

标签: c pointers pointer-arithmetic

假设double u[100]的第一个元素的地址为0x1000sizeof(double)8。什么

printf("%p %p\n", &u[3] - 1, &u[20] - 5)

输出

作业答案是

echo '0x1010 0x1078'      

他们是如何完成第二部分的&u[20] - 5

2 个答案:

答案 0 :(得分:4)

首先,要意识到数组是连续内存位置中的值序列:因此u的内存布局如下:

0x1000: u[0]
0x1008: u[1]
0x1010: u[2]
0x1018: u[3]
0x1020: u[4]
0x1028: u[5]

因此,如果您为printf("%p\n", &u[3]);的地址(printf)执行%p(表示" &指针(u[3]) "),你期待0x1018

但是您的代码显示&u[3]-1,因此您认为它会打印一个小于0x1018或0x1017的代码。但是C的工作方式不同:&u[3]是一个双指针,所以"比#34;是 previous double:0x1010

您可以为&u[20]-5

应用类似的参数

答案 1 :(得分:1)

所以第一个可以像这样找到

如果& u [0] == 0x1000则& u [1] == 0x1008,& u [2] == 0x1010& u [3] == 0x1018

请记住,0x表示十六进制数,因此0x1010为0x1000 + 16(基数为10)

然后你需要知道在c中,如果你有一个double *并从中减去1,那么将减去sizeof(double)的值,而不是1.这被称为'指针算术&# 39;

所以你们一起拥有& u [3] - 1 == 0x1018 - 8 == 0x1010