为什么“C”中arr和&arr的地址相同

Ham*_*Dev 1 c arrays pointers memory-address

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

但我无法理解为什么 name ofarray&array指向同一个地址。我想到的是,它将打印存储数组中第一项地址的指针的地址。

代码

#include <stdio.h>

int main()
{
    char arr[3];

    printf("array = %p\n", arr);
    printf("&array[0] = %p\n", &arr[0]);
    printf("&array = %p\n", &arr);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出

array = 0061FF1D
&array[0] = 0061FF1D
&array = 0061FF1D
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 5

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

该名称array指向第一项的地址。它实际上是整个数组。造成混乱的原因是,在大多数情况下,数组的名称会衰减为指向其第一个成员的指针。

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

在您的特定情况下,&array[0]has typechar *&arrayhas type char (*)[3](即指向大小为 3 的数组的指针char)。