为啥 cout 打印 char 数组与其他数组不同?
Posted
技术标签:
【中文标题】为啥 cout 打印 char 数组与其他数组不同?【英文标题】:Why does cout print char arrays differently from other arrays?为什么 cout 打印 char 数组与其他数组不同? 【发布时间】:2009-02-01 23:19:33 【问题描述】:我正在使用 C++ 来了解指针的工作原理。我有这段代码使用数组,我使用它只是为了了解等价物如何与指针一起使用。
int main()
int arr[10] = 1,2,3;
char arr2[10] = 'c','i','a','o','\0';
cout << arr << endl;
cout << arr2 << endl;
但是,当我运行它时,arr
输出整数数组的第一个元素的地址(如预期的那样),但 arr2
不输出字符数组的第一个元素的地址;它实际上打印“ciao”。
我遗漏了什么或者我还没有了解到什么?
【问题讨论】:
【参考方案1】:对于const void*
和const char*
,重载的是运算符const char* 并传递给该重载,因为它比 const void*
更适合。但是,int 数组被转换为 const void*
并传递给该版本。 operatorconst void* 只是输出地址。采用 const char*
的版本实际上将其视为 C 字符串并输出每个字符,直到终止空字符。如果您不希望这样,请在将 char 数组传递给 operator 时将其显式转换为 const void*
cout << static_cast<const void*>(arr2) << endl;
【讨论】:
根据this 仅对 void* 进行重载。这是否意味着它能够确定指针是否指向字符,如果是,它会查找终端字符并打印字符串? (还是有点难过) @rmp251: 错过these?【参考方案2】:因为 cout 的 operator <<
被重载以供 char*
输出字符串,而 arr2
与之匹配。
如果您想要地址,请尝试将字符数组转换为 void 指针。
【讨论】:
【参考方案3】:char* 有一个标准重载,它输出一个以 NUL 结尾的字符串。
【讨论】:
【参考方案4】:虽然强制转换可能是一种更有意义的方法,但您也可以使用 addressof 运算符:
cout << &arr2 << endl;
【讨论】:
这里可能需要&arr2[0]
而不是&arr2
地址相同,Shawley。
C/C++ 中的数组只是一系列内存位置。所以数组的地址就是第一个元素的地址。想知道为什么这被否决
主要是因为它没有解释这个想法 - char[10]* 不会转换为 char*。以上是关于为啥 cout 打印 char 数组与其他数组不同?的主要内容,如果未能解决你的问题,请参考以下文章
为啥指向 char 的指针与指向 char 作为数组元素的指针的行为不同?
如果 char 数组是 Java 中的 Object,为啥打印它不显示其哈希码?