0

例如,

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

给出:

Hello 0x7ffff85c0cf5

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

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

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

4

2 回答 2

7

是的,你完全正确。<<运算符 onostream对 a 有一个特殊的重载const char*

没有为 an 提供这样的重载int*- 在这种情况下,const void*选择了重载。

于 2019-09-05T08:23:28.370 回答
1

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

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

于 2019-09-05T08:34:38.847 回答