单维数组地址

use*_*571 0 c arrays

char arr[10]="hello";
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 5

鉴于:

char arr[10];
Run Code Online (Sandbox Code Playgroud)

如你所说,&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;
}
Run Code Online (Sandbox Code Playgroud)

示例输出(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"
Run Code Online (Sandbox Code Playgroud)

需要注意的是,虽然值arr&arr相同,类型不同.这arr+1&arr+1线条最清楚地证明了这一点.如您所见,递增&arr1会将其指向(a char [10])的对象的sizeof添加到地址.

您可以扩展示例以根据需要添加其他值.