0
char arr[10]="hello";

我猜&arr这个数组中的类型是char(*)[10]. 如果我是对的,那是什么类型的*(&arr)?它是基地址类型还是数组中第一个元素的地址?

4

5 回答 5

5

鉴于:

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]) 添加到地址。

您可以扩展示例以添加您认为合适的其他值。

于 2013-05-30T14:41:24.860 回答
4

表达式*(&arr)与 的类型相同arr。取消引用和地址操作符相互抵消。

您使用address-of 运算符&来获取地址,即获取一个指针。您使用解引用运算符*来获取指针指向的值。因此,在这种情况下,像这样使用它们没有任何意义。

于 2013-05-30T14:40:16.647 回答
2

*(&arr)是基地址类型,其中 as*(&arr[0])是数组中的第一个元素。

于 2013-05-30T14:40:51.967 回答
2
   char arr[10];

arr具有类型“10 个字符的数组”并且&arr是“指向 10 个字符的数组的指针”。, *(&arr)arr, 相同,类型相同,即基地址。

&arr[0]将产生一个指向第一个元素地址的指针。

于 2013-05-30T14:57:13.603 回答
0

a, *(&a), &a[0] 相同(数组a的基地址/数组a的第一个元素的地址)。

于 2013-05-30T15:37:04.030 回答