C - 类型和指针地址



假设双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

相关内容

  • 没有找到相关文章

最新更新