假设这个数组:
int arr[5] = { 1, 2, 3, 4, 5 };
这里arr
有两个用途 - 它是数组的名称,它充当指向数组中第一个元素的指针,因此默认情况下arr
等于&arr[0]
。
我的问题是,&arr
呢? 这也等于上述吗?
数组实际上是内存的范围。因此,扩展数据的地址是此扩展数据块中存储的数组及其第一个元素的地址。
因此,表达式中使用的数组指示符(极少数例外(将转换为指向其第一个元素的指针。
使用您提供的示例
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 %sn",
( void * )&arr == ( void * )&arr[0] ? "true" : "false" );
printf( "sizeof( *&arr ) = %zun", sizeof( *&arr ) );
printf( "sizeof( *&arr[0] ) = %zun", sizeof( *&arr[0] ) );
return 0;
}
它的输出是
&arr == &arr[0] is true
sizeof( *&arr ) = 20
sizeof( *&arr[0] ) = 4