C++ 当给定一个数组时,cout如何工作?

C++ 当给定一个数组时,cout如何工作?,c++,cout,C++,Cout,可能重复: 如果我有此代码: char myArray[] = { 'a', 'b', 'c' }; cout << myArray; int myArray[] = { 1, 2, 3 }; cout << myArray; 它给了我这个输出: 0x28ff30 为什么不打印123?您没有向它传递一个整数数组;您已经向它传递了一个指向int的指针。当面对指针时,它会打印出它指向的地址。它无法打印出数组,因为它不知道它有多少个元素(如果有的话) 当您使用指向字符的指

可能重复:

如果我有此代码:

char myArray[] = { 'a', 'b', 'c' };
cout << myArray;
int myArray[] = { 1, 2, 3 };
cout << myArray;
它给了我这个输出:

0x28ff30


为什么不打印123?

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


当您使用指向字符的指针时,它起作用的原因是它知道所有字符数组都以NUL(
\0
)字符结尾,因此您没有告诉它数组中的字符数并不重要。请记住,您的数组不是以NUL结尾的,因此只有运气好,您才得到了
abc
,并且在末尾没有额外的垃圾字符。

,因为它无法知道您的数组是一个数组,或者数组中有什么样的数据。执行
cout时,第一段代码工作的原因是编译器将数组隐式转换为
const char*
字符指针,然后将其解释为C样式字符串。有趣的是,这段代码不安全,因为您的字符数组没有显式以null结尾。因此,打印它将开始读取和打印字符,直到您碰巧发现一个空字节,这将导致未定义的行为

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


希望这有帮助

在上下文
cout中使用
myArray
时,有一个
操作符std::cout是std::ostream的一个实例,并且提供了多个重载操作符

例如:

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

std::ostream&operator为什么不打印出第一个的地址呢?@John:我更新了我的答案并说明了原因。不,他给了它一个数组。当然,不存在重载,所以它会在考虑转换的情况下查找重载,但他不是在给它传递一个指针。Tch,我真的必须输入得更快+1.准确地陈述了我想说的话。:)@谢谢你指出这一点!我会适当地更新答案。
myArray
不是指针,而是数组。如果未找到合适的
运算符重载,为什么要将其标记为
c
?C中没有
cout
!和