单维数组地址

时间:2013-05-30 14:38:17

标签: c arrays

char arr[10]="hello";

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

5 个答案:

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