char arr[10]="hello";
我猜&arr这个数组中的类型是char(*)[10]. 如果我是对的,那是什么类型的*(&arr)?它是基地址类型还是数组中第一个元素的地址?
鉴于:
char arr[10];
正如你所说,&arr是 type char (*)[10]。本身,*(&arr)是 type 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;
}
示例输出(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"
请注意,虽然 和 的值arr相同&arr,但类型不同。arr+1和&arr+1线最清楚地表明了这一点。如您所见,加&arr一会将它指向的对象的 sizeof (a char [10]) 添加到地址。
您可以扩展示例以添加您认为合适的其他值。
表达式*(&arr)与 的类型相同arr。取消引用和地址操作符相互抵消。
您使用address-of 运算符&来获取地址,即获取一个指针。您使用解引用运算符*来获取指针指向的值。因此,在这种情况下,像这样使用它们没有任何意义。
*(&arr)是基地址类型,其中 as*(&arr[0])是数组中的第一个元素。
char arr[10];
arr具有类型“10 个字符的数组”并且&arr是“指向 10 个字符的数组的指针”。, *(&arr)与arr, 相同,类型相同,即基地址。
&arr[0]将产生一个指向第一个元素地址的指针。
a, *(&a), &a[0] 相同(数组a的基地址/数组a的第一个元素的地址)。