【问题标题】:printing the address of the name of an array in C [duplicate]在C中打印数组名称的地址[重复]
【发布时间】:2018-05-31 09:51:22
【问题描述】:

:)

这是我的代码:

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 的“单元格”的地址吗?

非常感谢任何输入! 干杯

【问题讨论】:

  • 指针的地址是第一个索引的地址。
  • 我建议的副本也是谷歌搜索问题标题的第一个(对我而言)...

标签: c arrays pointers


【解决方案1】:

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

&num 是一个完全不同的表达式,因为它是一个指向数组本身的指针。这个类型是char (*)[11]。碰巧num(因此&num[0])和&num 都指向同一个位置,但由于它们是不同的类型,所以它们在语义上是不同的。

有点“图形化”你可以看到你的数组是这样的:

+---+---+---+---+---+---+---+---+---+---+---+ |中号 |我 |小号 |小号 |我 |小号 |小号 |我 | p | p |我 | +---+---+---+---+---+---+---+---+---+---+---+ ^ ^ ^ ^ | | | | | | &num[2] ... &num[11] | | | | &num[1] (&num)[1] | &num[0] | &num

重复一遍,普通的num衰减(即由编译器翻译)为&num[0]。并且&num&num[0] 都指向同一个位置,但属于不同的类型。


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

你的数组没有这个终结符的空间。

【讨论】:

  • 感谢您的回复!但是,我仍然不明白为什么指针本身的地址和指针的值可能永远相同。这就像指针指向自己......这应该没用?
  • @Bobstanley 更新了“图片”,希望能更清晰。
猜你喜欢
  • 1970-01-01
  • 2015-09-29
  • 2015-12-31
  • 2016-12-31
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多