关于c ++:为什么cout打印char数组与其他数组不同?

Why does cout print char arrays differently from other arrays?

我用C++来理解指针是如何工作的。我有一段使用数组的代码,我用它来理解等价物如何处理指针。

1
2
3
4
5
6
int main() {    
    int arr[10] = {1,2,3};    
    char arr2[10] = {'c','i','a','o','\0'};
    cout << arr << endl;
    cout << arr2 << endl;
}

然而,当我运行这个命令时,arr输出ints数组的第一个元素的地址(如预期的那样),但arr2不输出chars数组的第一个元素的地址;它实际上输出"ciao"。

我错过了什么,或者我还没有了解到什么?


对于const void*const char*,运算符<<超载。char数组转换为const char*并传递给该重载,因为它比const void*更适合。但是,int数组被转换为const void*并传递给该版本。operator<const void*的版本只输出地址。采用const char*的版本实际上将其视为C字符串,并输出每个字符,直到终止的空字符。如果不希望这样做,请在将char数组传递给operator<<:

1
cout << static_cast<const void*>(arr2) << endl;


因为cout的operator <<char*输出字符串时过载,而arr2与之匹配。

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


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

1
cout << &arr2 << endl;


char*的标准重载输出以nul结尾的字符串。