Arrays 使用数组名称与使用s&;的地址之间的差异;数组名称?
所以我在研究数组和指向数组的指针,我发现了这段代码。 我想知道为什么最后一个元素的地址是FE14,它不应该是第一个元素的地址加上(数据类型的大小)4,所以我应该是FE04吗Arrays 使用数组名称与使用s&;的地址之间的差异;数组名称?,arrays,c,pointers,memory-address,Arrays,C,Pointers,Memory Address,所以我在研究数组和指向数组的指针,我发现了这段代码。 我想知道为什么最后一个元素的地址是FE14,它不应该是第一个元素的地址加上(数据类型的大小)4,所以我应该是FE04吗 #include <stdio.h> int main() { int arr[5]; printf("%p\n",arr); //----> the output FE00 printf("%p\n",arr+1); //----> t
#include <stdio.h>
int main()
{
int arr[5];
printf("%p\n",arr); //----> the output FE00
printf("%p\n",arr+1); //----> the output FE04
printf("%p\n",&arr); //----> the output FE00
printf("%p\n",&arr+1); //----> the output FE14
}
#包括
int main()
{
int-arr[5];
printf(“%p\n”,arr);//--->输出FE00
printf(“%p\n”,arr+1);//--->输出FE04
printf(“%p\n”,&arr);//----->输出FE00
printf(“%p\n”,&arr+1);//--->输出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("%p\n", arr+1);
在该代码中,arr
是一个整数指针,因此arr+1
导致arr+1*sizeof(int)
,即4
printf("%p\n",&arr+1);
在本例中,
&arr
是一个指向5int
数组的指针,因此&arr+1
结果是&arr+1*sizeof(int[5])
,即20(十六进制中的14)对于您的答案,我不知道&arr将是20个字节,在使用%p
格式说明符打印指针之前,将指针强制转换为键入void*
。而且,arr
和&arr[0]
是一样的。