为啥 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 &lt;&lt; 被重载以供 char* 输出字符串,而 arr2 与之匹配。

如果您想要地址,请尝试将字符数组转换为 void 指针。

【讨论】:

【参考方案3】:

char* 有一个标准重载,它输出一个以 NUL 结尾的字符串。

【讨论】:

【参考方案4】:

虽然强制转换可能是一种更有意义的方法,但您也可以使用 addressof 运算符:

cout << &arr2 << endl;

【讨论】:

这里可能需要&amp;arr2[0] 而不是&amp;arr2 地址相同,Shawley。 C/C++ 中的数组只是一系列内存位置。所以数组的地址就是第一个元素的地址。想知道为什么这被否决 主要是因为它没有解释这个想法 - char[10]* 不会转换为 char*。

以上是关于为啥 cout 打印 char 数组与其他数组不同?的主要内容,如果未能解决你的问题,请参考以下文章

C++中cout<<字符数组名;为啥能输出字符串?

为啥指向 char 的指针与指向 char 作为数组元素的指针的行为不同?

如果 char 数组是 Java 中的 Object,为啥打印它不显示其哈希码?

为啥 Arrays.toString() 会给出与手动打印数组不同的输出? [关闭]

数组声明为 unsigned char 时的垃圾值

如何使用ifstream将char数组打印到char数组