假设此数组:
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 %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