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

在C中打印数组名称的地址,c,arrays,pointers,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; } 为什么我会得到相同的地

:

这是我的代码:

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);
以及:

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

&num是否应该打印指针本身的地址,num是否应该打印存储M的“单元格”的地址

非常感谢您的任何意见!
干杯

不,数组不是指针。但它可以衰减为指向其第一个元素的指针。这就是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 重复一下,plain num将衰减,即被编译器翻译为&num[0]。&num和&num[0]都指向同一位置,但类型不同

另一方面,请记住C中的字符字符串实际上称为以null结尾的字节字符串。这个空终止符使字符串成为字符串,所有字符串处理函数都使用这个终止符来知道字符串的结尾在哪里


您的数组没有空间放置此终止符。

指针的地址是第一个索引的地址。我建议的副本也是我在google上搜索您的问题标题的第一次点击…感谢您的回复!但是,我仍然不明白为什么指针本身的地址和指针的值可能是相同的。“这就像指针指向自己……这应该是无用的?”Bobstanley更新了一张图片,希望能让它更清晰。