char arr[10]="hello";
我猜这个数组中的&arr
类型为char(*)[10]
。
如果我是对的,*(&arr)
的类型是什么?它是类型基址还是数组中第一个元素的地址?
答案 0 :(得分:5)
假设:
char arr[10];
正如您所说,&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;
}
示例输出(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
递增1会将其指向的对象的sizeof(char [10]
)添加到该地址。
您可以扩展示例以根据需要添加其他值。
答案 1 :(得分:4)
表达式*(&arr)
与arr
的类型相同。运营商的解除引用和地址相互抵消。
您使用地址运算符&
来获取地址,即获取指针。您可以使用解除引用运算符*
来获取指针指向的值。因此,在这种背景下使用它们两者都没有任何意义。
答案 2 :(得分:2)
*(&arr)
的类型是基址,其中*(&arr[0])
是数组中的第一个元素。
答案 3 :(得分:2)
char arr[10];
arr
的类型为“10个字符的数组”,&arr
是“指向10个字符数组的指针”。 ,*(&arr)
与arr
相同,并且具有相同的类型,即基址。
&arr[0]
将产生一个指向第一个元素地址的指针。
答案 4 :(得分:0)
a,*(&amp; a),&amp; a [0]相同(数组的基地址a /数组a的第一个元素的地址)。