给阵列时cout如何工作?

时间:2011-03-22 23:41:35

标签: c++ cout

  

可能重复:
  Why does cout print char arrays differently from other arrays?

如果我有这段代码:

char myArray[] = { 'a', 'b', 'c' };
cout << myArray;

它给了我这个输出:

abc

但是,如果我有这段代码:

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

它给了我这个输出:

0x28ff30

为什么不打印123?

6 个答案:

答案 0 :(得分:15)

第一段代码工作的原因是编译器隐式地将数组转换为const char *字符指针,然后将其解释为C风格的字符串。有趣的是,此代码安全,因为您的字符数组未显式为空终止。因此,打印它将开始读取和打印字符,直到您巧合地找到空字节,这会导致未定义的行为。

在第二种情况下,编译器使用int数组并将其隐式转换为指向第一个元素的int *指针,然后从那里转换为指向第一个元素的const void *指针元件。使用const void *打印cout指针只会打印其地址,因此会输出您的输出。

希望这有帮助!

答案 1 :(得分:1)

在上下文myArray中使用cout << myArray;时,它会衰减为指针。将operator<<作为其第二个参数的char*输出一个字符串;采用其他类型指针的那个只输出一个地址。因此观察到的行为。

你的char数组实际上不是以null结尾的,所以我猜你在第一种情况下看到的实际上只是未定义的行为,恰好在这个例子中做了“正确的事情”。

答案 2 :(得分:1)

有一个operator <<知道左侧的basic_ostream个实例(例如cout)和右侧的const char*

没有为const int*(或const int[])定义此类运算符。虽然你可以自由地创造一个。

请务必在数组末尾指定一个标记,以防止在缓冲区结束时运行。

您看到指针值的原因是因为有一个basic_ostream::operator<<(const void*)会打印出来。

答案 3 :(得分:1)

std :: cout是std :: ostream的一个实例,并且提供了几个重载运算符。

例如:

std::ostream& operator << (std::ostream&, char*);

键入std :: cout&lt;&lt; somevar;编译器查找最匹配的重载。首先是变量的确切类型,然后可以隐式转换为任何内容(更不用说成员函数/自由函数/模板函数等)。

以下是关于C++ Overload Resolution

的随机文章

答案 4 :(得分:0)

你还没有通过一系列的整数;你已经传递了一个指向int的指针。当面对指针时,它会打印出它指向的地址。它无法打印出一个数组,因为它不知道它有多少元素(如果有的话)。

当你使用指向字符的指针时它起作用的原因是它知道所有字符数组都由NUL(\0)字符终止,所以你没有告诉它并不重要它是数组中的字符数。请记住,你的数组并没有被NUL终止,所以只有幸运的是你得到abc并且最后没有额外的垃圾字符。

答案 5 :(得分:0)

因为它无法知道您的数组是一个数组,还是其中包含哪种数据。当你执行cout << myArray时,'myArray'被视为指针类型,它可能指向任何东西。因此,不是试图取消引用指针(如果指针尚未初始化,可能会使应用程序崩溃),而是打印指针所指向的地址。