通过在我的计算机上运行这个程序,我得到了相同的地址。我是指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 + 2
和1.0 + 2.0
的值sum相同,但类型不同。printf("%pn", arr); printf("%pn", &arr); printf("%pn", &arr[0]);
打印相同并不意味着arr
和&arr
是相同的东西-超过3和3.0在某些属性上的不同。