例如,
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
但我想知道为什么这个整数数组和字符数组(字符串文字)之间存在差异。这是只为字符串保留的特殊情况吗?
是的,你完全正确。<<运算符 onostream对 a 有一个特殊的重载const char*。
没有为 an 提供这样的重载int*- 在这种情况下,const void*选择了重载。
有一个重载operator<<for const char*,您的const char[]数组会衰减到该重载。此重载将char数据视为以空字符结尾的字符串,打印出字符直到达到空字符。但是,您的char[]数组中没有空终止符。你很幸运,你只看到Hello而不是额外的垃圾,或者让应用程序崩溃。因此,您的代码具有未定义的行为。
数组没有重载operator<<。const int[]您的数组衰减到,由以 a作为输入的重载const int*处理,该重载打印出指向的地址。operator<<const void*