【问题标题】:In char x[10]="hello" , why cout<<x; doesn't print out the array's address? [duplicate]在 char x[10]="hello" 中,为什么 cout<<x;不打印出数组的地址? [复制]
【发布时间】:2016-11-17 17:11:22
【问题描述】:

int x[3] = {1, 2, 3, 4};
cout<<x;

将打印出 x 地址。但是如果我选择字符数组,比如

char x[10]="Hello";

它打印出字符串

你好

假设编译器足够聪明,可以理解在 char array 的情况下,打印出地址的意义不大,因此它会打印出字符串,那么我该如何打印 char 数组地址?

考虑一下这个说法

char *ptr = "hello";

为什么这是合法的,指针不应该只存储地址吗?

【问题讨论】:

  • 这是因为operator&lt;&lt;(ostream&amp;,T) 有一个T=const char* 的重载,它打印完整的字符串而不仅仅是地址(参见例如here
  • 你可能想要cout &lt;&lt; static_cast&lt;void *&gt;(x);

标签: c++ arrays string pointers


【解决方案1】:

它会打印“Hello”,因为operator &lt;&lt; 有一个const char* 的重载(如果您通过x,这就是您要传递的内容)打印出一个char 并移动到下一个char直到找到 NUL 字符。 "Hello" 在末尾有一个编译后添加的 NUL 字符,所以你的字符串实际上是 "Hello\0"。

要获取地址,您可以将其转换为void* 以消除const char* 的重载:

reinterpret_cast<const void*>(x)

为什么这是合法的,指针不应该只存储地址吗?

是的,这正是ptr 正在存储的内容。当您将指针分配给 const char[] 的“Hello”时,ptr 将指向该数组的 [0]。请注意,在这种情况下,首先必须从 const char*char* 进行转换,这已被弃用多年并且自 C++11 以来是非法的,因为尝试通过此 char* 编辑指针会导致未定义行为。一些编译器仍然允许这样做,但实际上它们应该发出错误。

【讨论】:

  • 吹毛求疵/不确定我的英语技能:不是“将“Hello”分配给指针”而不是“将指针分配给“Hello””吗?
  • 是的....我也这么想@tobi303
猜你喜欢
  • 2019-09-28
  • 2014-05-17
  • 2012-06-07
  • 2010-10-04
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多