char arr[10]="hello";
Run Code Online (Sandbox Code Playgroud)
我猜&arr这个数组是类型的char(*)[10].如果我是对的,那是什么类型的*(&arr)?是数组中第一个元素的类型基址还是地址?
鉴于:
char arr[10];
Run Code Online (Sandbox Code Playgroud)
如你所说,&arr属于类型char (*)[10].它本身*(&arr)就是类型char [10],但在大多数情况下(除了sizeof())它将char *在使用时变成.
示例代码:
#include <stdio.h>
int main(void)
{
char arr[10] = "hello";
printf("arr[10] = \"%s\"\n", arr);
printf("arr = %p\n", arr);
printf("&arr = %p\n", &arr);
printf("*(&arr) = %p\n", *(&arr));
printf("sizeof(*(&arr)) = %zu\n", sizeof(*(&arr)));
printf("arr+1 = %p\n", arr+1);
printf("&arr+1 = %p\n", &arr+1);
printf("*(&arr) = \"%s\"\n", *(&arr));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
示例输出(GCC 4.7.1,Mac OS X 10.8.3):
arr[10] = "hello"
arr = 0x7fff4ff15500
&arr = 0x7fff4ff15500
*(&arr) = 0x7fff4ff15500
sizeof(*(&arr)) = 10
arr+1 = 0x7fff4ff15501
&arr+1 = 0x7fff4ff1550a
*(&arr) = "hello"
Run Code Online (Sandbox Code Playgroud)
需要注意的是,虽然值arr和&arr相同,类型不同.这arr+1和&arr+1线条最清楚地证明了这一点.如您所见,递增&arr1会将其指向(a char [10])的对象的sizeof添加到地址.
您可以扩展示例以根据需要添加其他值.