在char x [10] =“hello”中,为什么cout&lt; <x;不=“”print =“”out =“”=“”数组=“”地址?=“”

时间:2016-11-17 17:11:23

标签: c++ arrays string pointers

=“”

As在

Sub New
ActiveSheet.Range(“c9”).End(xlRight).Offset(1,0).Select
Selection.Insert Shift:xlToRight
Selection.Insert Shift:xlToRight
Selection.Insert Shift:xlToRight
End Sub

会输出x地址。但是如果我选择字符数组,比如

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

打印出字符串

  

您好

让我们说编译器足够聪明,可以理解,在char数组的情况下,打印地址更少,所以它打印出字符串,然后如何打印字符数组地址?

并考虑这个陈述

char x[10]="Hello";

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

1 个答案:

答案 0 :(得分:1)

它打印&#34;你好&#34;因为operator <<有一个const char*的重载(如果你通过x,那就是你通过的那个),它打印出一个char并移到下一个char {1}}直到找到NUL字符。 &#34;你好&#34;最后有一个编译添加的NUL字符,所以你的字符串实际上是&#34; Hello \ 0&#34;。

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

reinterpret_cast<const void*>(x)
  

为什么这个合法的,Aren指针应该只存储地址?

是的,这正是ptr正在存储的内容。当你指定一个指针&#34; Hello&#34;这是const char[] ptr将指向该数组的[0]。请注意,在这种情况下,首先必须从const char*char*进行转换,该转换已被弃用多年,并且因为C ++ 11非法,因为尝试通过此{{1}编辑指针对象将导致未定义的行为。有些编译器仍允许这样做,但实际上它们应该发出错误。