在C中打印数组名称的地址

时间:2018-05-31 09:51:23

标签: c arrays pointers

:)

这是我的代码:

int main(void)
{
    char num[11] = { "Mississippi" };

    printf("%p\n", &num); // prints 0x7fffe44a5eb0
    printf("%p\n", num);  // prints 0x7fffe44a5eb0
    printf("%c\n", *num); // prints M

    return EXIT_SUCCESS;
}

为什么我会获得相同的地址:

printf("%p\n", &num);

和for:

printf("%p\n", num);

不应该打印指针本身的地址,并且打印“'”单元格的地址。 M存储在哪里?

任何输入都非常感谢! 欢呼声

1 个答案:

答案 0 :(得分:3)

不,数组不是指针。但它可以衰减指向其第一个元素的指针。这就是num&num[0]相同的原因。该指针的类型为char *

表达式&num是完全不同的,因为它是指向数组本身的指针。其类型为char (*)[11]。事实恰恰相反,num(因此&num[0])和&num都指向同一位置,但由于它们是不同的类型,因此它们在语义上是不同的。

有点"图形"你可以看到你的数组:

+---+---+---+---+---+---+---+---+---+---+---+
| M | i | s | s | i | s | s | i | p | p | i |
+---+---+---+---+---+---+---+---+---+---+---+
^   ^   ^                                   ^
|   |   |                                   |
|   |   &num[2] ...                         &num[11]
|   |                                       |
|   &num[1]                                 (&num)[1]
|
&num[0]
|
&num

重复一遍,普通num衰变(即由编译器翻译)到&num[0]&num&num[0]都指向同一位置,但属性不同。

另外请注意,请记住C中的char字符串实际上称为 空终止 字节字符串。这个 null-terminator 是使字符串成为字符串的原因,所有字符串处理函数都使用此终结符来知道字符串结尾的位置。

您的数组没有此终结符的空间。