假设double u[100]
的第一个元素的地址为0x1000
,sizeof(double)
为8
。什么
printf("%p %p\n", &u[3] - 1, &u[20] - 5)
输出
作业答案是
echo '0x1010 0x1078'
他们是如何完成第二部分的&u[20] - 5
?
答案 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