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
!和