假设双u[100]
的第一个元素有地址0x1000
,并且sizeof(double)
是8
。什么作用
printf("%p %pn", &u[3] - 1, &u[20] - 5)
输出?
作业答案是
echo '0x1010 0x1078'
他们是如何完成第二部分&u[20] - 5
的?
首先,意识到数组是连续内存位置中的值序列:因此u
的内存布局如下:
0x1000: u[0]
0x1008: u[1]
0x1010: u[2]
0x1018: u[3]
0x1020: u[4]
0x1028: u[5]
因此,如果您执行printf("%pn", &u[3]);
(这意味着" printf
一个指针(%p
)来表示u[3]
"的地址(&
),您会期望0x1018
。
但是你的代码说&u[3]-1
,所以你会认为它会打印一个少于0x1018,或者0x1017
。但是 C 的工作方式不同:&u[3]
是指向双精度的指针,因此"比这少一个"是前一个双精度:0x1010
。
您可以对&u[20]-5
应用类似的参数
所以第一个可以像这样找到
如果 &u[0] == 0x1000则 &u[1] == 0x1008, &u[2] ==0x1010 &u[3] == 0x1018
请记住,0x 表示十六进制数,因此0x1010是 0x1000 + 16(以 10 为基数)
然后你需要知道,在 C 中,如果你有一个双精度*并从中减去 1,这将把值减 sizeof(double),而不是 1。这称为"指针算术"
所以你总共有 &u[3] - 1 == 0x1018 - 8 == 0x1010