为什么cout打印char数组与其他数组不同?

Luc*_*eis 14 c++ arrays pointers

我正在使用C++来理解指针是如何工作的.我有这段代码使用数组,我只是用它来理解等价物如何与指针一起工作.

int main() {    
    int arr[10] = {1,2,3};    
    char arr2[10] = {'c','i','a','o','\0'};
    cout << arr << endl;
    cout << arr2 << endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,arr输出整数数组的第一个元素的地址(如预期的那样),但arr2不输出字符数组的第一个元素的地址; 它实际上打印"ciao".

我错过了什么或者我还没有学到这个?

Joh*_*itb 29

这是运算符<<为了重载const void*而为const char*.你的char数组被转换为const char*并传递给那个重载,因为它比to更适合const void*.但是,int数组将转换const void*为该类型并传递给该版本.运算符<<的版本const void*只是输出地址.采用const char*实际的版本将其视为C字符串,并输出每个字符,直到终止空字符.如果您不想这样做,请在将char数组const void*传递给operator <<时将其明确转换为:

cout << static_cast<const void*>(arr2) << endl;
Run Code Online (Sandbox Code Playgroud)

  • @ rmp251:错过[这些](http://www.cplusplus.com/reference/ostream/ostream/operator-free/)? (3认同)

cra*_*str 5

因为 cout'soperator <<被重载char*以输出字符串,并arr2匹配它。

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