为什么 C++ 中的字符数组返回其项目而不是地址?

Why does an array of characters in C++ return its items instead of its address?

本文关键字:项目 地址 返回 C++ 字符 数组 为什么      更新时间:2023-10-16

例如,

const char str[] ={'H','e','l','l','o', ''};
const int nums[] = {1,2,3,4,5};
cout << str << " " << nums;

给:

Hello 0x7ffff85c0cf5

显然,如果我想获得两者的地址,我可以这样做

cout << &str << " " << nums

但我想知道为什么这个整数数组和字符数组(字符串文字(之间存在差异。这是仅对字符串保留的特殊情况吗?

是的,你是绝对正确的。ostream上的<<运算符具有用于const char*的特殊重载。

没有为int*提供此类重载 - 在这种情况下,将选取const void*重载。

有一个重载的operator<<用于const char*,你的const char[]数组衰减到这个。此重载将char数据视为以 null 结尾的字符串,打印出字符,直到达到 null 字符。但是,您的char[]数组中没有空终止符。您很幸运,您只看到Hello而不是额外的垃圾,或者使应用程序崩溃。因此,您的代码具有未定义的行为

const int[]数组没有operator<<重载。您的数组衰减为const int*,这由operator<<重载处理,该重载将const void*作为输入,打印出所指向的地址。