使用 array_name V.s 和 array_name 地址之间的区别?



所以我研究了数组和指向数组的指针,发现了这段代码。我想知道为什么最后一个的地址是FE14,不是假设它是第一个元素的地址加上(数据类型的大小(4,所以我应该是FE04吗?

#include <stdio.h>
int main()
{
int arr[5];
printf("%pn",arr); //----> the output FE00
printf("%pn",arr+1); //----> the output FE04
printf("%pn",&arr); //----> the output FE00
printf("%pn",&arr+1); //----> the output FE14
}

这很令人困惑,因为C数组可以衰减为指针表达式。

对于arrarr+1,指针的数据类型是int,在您的系统中是4字节,因此您可以看到FE00FE04之间的4字节差异。

对于&arr&arr+1,指针的数据类型是int[5],即20字节,因此您可以看到FE00FE14之间的20字节差异

这是0x14的区别,即:

1 * 16^1 + 4 * 16^0
= 1 * 16   + 4 * 1
= 16       + 4
= 20

如果您将int arr[5]的大小从5 int长更改为500,您将看到&arr&arr+1之间有更大的差异。

printf("%pn", arr+1);

在该代码中,arr是一个整数指针,因此arr + 1会产生arr + 1 * sizeof(int),即4。

printf("%pn",&arr+1);

在本例中,&arr是指向5个int的数组的指针,因此&arr + 1会产生&arr + 1 * sizeof(int[5]),即20(十六进制为14(

最新更新