我们已经了解到,如果我们打印一个像int a[]={1,2,3};
这样的数组cout<<a;
,那么它会输出数组的第一个元素的地址。但对于字符数组char a[]="Jayesha";
,当我们执行cout<<a;
时,它会打印整个数组而不是其地址。此外,如果我们打印&a[0]
它打印'Jayesha',&a[1]
打印'ayesha',&a[2]
打印'yesha',&a[3]
打印'esha'等等......
任何人都可以解释为什么会这样吗?
答案 0 :(得分:0)
答案 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*>
之前对数组执行<<
。