字符数组的名称打印整个数组而不是其地址

时间:2017-09-08 14:15:39

标签: c++11

我们已经了解到,如果我们打印一个像int a[]={1,2,3};这样的数组cout<<a;,那么它会输出数组的第一个元素的地址。但对于字符数组char a[]="Jayesha";,当我们执行cout<<a;时,它会打印整个数组而不是其地址。此外,如果我们打印&a[0]它打印'Jayesha',&a[1]打印'ayesha',&a[2]打印'yesha',&a[3]打印'esha'等等......

任何人都可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:0)

这是由于运算符重载,解释herehere

在您的两种情况下,您要么打印const void*,要么打印const char*,要么打印C:\> 字符串的内容。

答案 1 :(得分:0)

const char* a = "Jajesha";指向c样式的字符串。在内存中它看起来像

J  a  j  e  s  h  a  \0 ???
^
a
^     ^           ^     ^
&a[0] &a[2]       &a[6] &a[8]
   ^     ^           ^
   &a[1] &a[3]       &a[7]

你正在做一些指针算术 &a[x]相当于a+x。 它将是const char *类型。

超出长度访问时,在您的情况下>&gt; 7个字符,结果未定义且可能会崩溃

cout<<的{​​{1}}会输出所有字符,直到找到const char *

答案 2 :(得分:0)

这里使用的std::ostream& <<有两种不同的重载。

第一个是std::ostream& << void const*,第二个是std::ostream << const char*。所有指针都可以转换为void const*,数组转换为指向第一个元素的指针。

因此,当您将一组非字符数据传递给<<时,其最佳匹配是void const*重载,它会打印该地址。

将字符数据数组传递给<<时,其最佳匹配是char const*重载。该版本假设它有一个指向以null结尾的字符串的指针并打印该缓冲区。

为避免这种情况,请在将数据传递给static_cast<void*>之前对数组执行<<