所以我研究了数组和指向数组的指针,发现了这段代码。我想知道为什么最后一个的地址是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数组可以衰减为指针表达式。
对于arr
和arr+1
,指针的数据类型是int
,在您的系统中是4字节,因此您可以看到FE00
和FE04
之间的4字节差异。
对于&arr
和&arr+1
,指针的数据类型是int[5]
,即20字节,因此您可以看到FE00
和FE14
之间的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(