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的第一个元素的地址)。