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; |
- 根据这一点,它只为void*超载。这是否意味着它能够确定指针是否指向字符,如果指向字符,它会查找终端字符并打印字符串?(还是有点头疼)
- @RMP251:错过了这些吗?
因为cout的operator <<在char*输出字符串时过载,而arr2与之匹配。
如果需要地址,请尝试将字符数组转换为空指针。
虽然casting可能是一种更有意义的方法,但您也可以使用addressof运算符:
- 这里可能要用&arr2[0]而不是&arr2。
- 这些地址都一样,肖利。
- C/C++中的数组只是一系列的内存位置。所以数组的地址就是第一个元素的地址。想知道为什么投票否决
- 主要是因为它不能解释这个想法——char[10]*不能转换成char*。
char*的标准重载输出以nul结尾的字符串。