Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用数组名称与使用s&;的地址之间的差异;数组名称?_Arrays_C_Pointers_Memory Address - Fatal编程技术网

Arrays 使用数组名称与使用s&;的地址之间的差异;数组名称?

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

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

#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
是一个指向5
int
数组的指针,因此
&arr+1
结果是
&arr+1*sizeof(int[5])
,即20(十六进制中的14)

对于您的答案,我不知道&arr将是20个字节,在使用
%p
格式说明符打印指针之前,将指针强制转换为键入
void*
。而且,
arr
&arr[0]
是一样的。