为什么 arr 和 &arr 的地址在"C"中相同



通过在我的计算机上运行这个程序,我得到了相同的地址。我是指array&array[0],我理解array的名称指向array中第一项的地址。它们都是一样的

但是我不能来理解为什么array&array的名字指向同一个地址。我想到的是,它将打印存储数组中第一项地址的先锋地址。

代码
#include <stdio.h>
int main()
{
char arr[3];
printf("array = %pn", arr);
printf("&array[0] = %pn", &arr[0]);
printf("&array = %pn", &arr);
return 0;
}

输出
array = 0061FF1D
&array[0] = 0061FF1D
&array = 0061FF1D

值得注意的是,虽然数组和指针之间有一些相似之处,但它们并不是相同。

名称array指向第一项的地址。它实际上是整个数组。这种混淆来自于这样一个事实:在大多数上下文中,数组的名称将衰变成指向其第一个成员的指针。

当数组是sizeof操作符的操作数或&操作符的地址时,发生数组到指针衰减的两个值得注意的地方。对于后者,数组是一组连续的对象,并且(像任何对象一样)它有一个地址。数组的地址与其第一个成员的地址相同,因此array(在表达式中使用时,或等价的&array[0])和&array将具有相同的值,但类型不同。

在你的特殊情况下,&array[0]的类型是char *,而&array的类型是char (*)[3](即指向大小为3的char数组的指针)。

1 + 21.0 + 2.0的值sum相同,但类型不同。printf("%pn", arr); printf("%pn", &arr); printf("%pn", &arr[0]);打印相同并不意味着arr&arr是相同的东西-超过3和3.0在某些属性上的不同。

最新更新