C中数组的地址是否等于它的第一个元素

Is the address of an array equal to its first element in C

假设这个数组:

int arr[5] = { 1, 2, 3, 4, 5 };

这里的 arr 有两个用途 - 它是数组的名称,它充当指向数组中第一个元素的指针,因此 arr 等于 &arr[0] 默认。

我的问题是,&arr 怎么样?这也等于上面的吗?

数组其实就是一段内存。所以一个extent的地址就是这个extent中存储的数组的地址和第一个元素的地址。

因此,表达式中使用的数组指示符被转换为指向其第一个元素的指针。

使用您提供的示例

int arr[5] = { 1, 2, 3, 4, 5 };

这些表达式 &arr&arr[0] 具有相同的值但类型不同。

表达式 &arr 的类型为 int( * )[5] 而表达式 &a[0] 的类型为 int *.

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    int arr[5] = { 1, 2, 3, 4, 5 };

    printf( "&arr == &arr[0] is %s\n", 
            ( void * )&arr == ( void * )&arr[0] ? "true" : "false" );

    printf( "sizeof( *&arr )  = %zu\n", sizeof( *&arr ) );          
    printf( "sizeof( *&arr[0] )  = %zu\n", sizeof( *&arr[0] ) );            
    return 0;
}

它的输出是

&arr == &arr[0] is true
sizeof( *&arr )  = 20
sizeof( *&arr[0] )  = 4