2009-02-01 53 views
13

我正在使用C++来理解指针如何工作。我有一段使用数组的代码,我只是用它来理解等价物如何与指针一起工作。为什么cout打印字符数组与其他数组不同?

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

然而,当我运行此,arr输出整数(如预期)的阵列的第一个元素的地址,但arr2不输出字符的数组的第一个元件的地址;它实际上打印“ciao”。

什么是我失踪或我还没有学到这个?

回答

28

这是运营商< <超载为const void*const char*。你的char数组转换为const char*并传递给该超载,因为它比const void*更适合。然而,int数组转换为const void*并传递给该版本。运营商< <的版本取const void*只输出地址。采用const char*的版本实际上将其视为C字符串,并输出每个字符直到终止空字符。如果你不希望出现这种情况,将您的字符数组const void*它传递给运营商< <明确时:

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

根据[this](http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/),它只会被void *重载。这是否意味着它能够确定指针是否指向字符,如果是,它会查找终端字符并打印字符串? (仍然有点难倒) – rmp251 2013-10-02 02:17:29

+3

@ rmp251:错过[这些](http://www.cplusplus.com/reference/ostream/ostream/operator-free/)? – 2014-12-13 22:54:08

0

对于输出NUL终止字符串的char *有一个标准重载。

4

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

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

0

虽然铸造可能是一个更有意义的方式,你也可以使用AddressOf运算符:

cout << &arr2 << endl;