字符串中的[0]和& a [0]之间有什么区别?

时间:2015-01-26 23:22:11

标签: c++ string

string a = "asdf";
cout<<&a[0];
cout<<a[0];

为什么这两个输出有所不同?为什么&a[0]不是地址而是整个字符串?

3 个答案:

答案 0 :(得分:13)

&a[0]的类型为char *。故意为<<参数重载流运算符const char *,以输出从该地址开始的以零结尾的字符串(C样式字符串)。例如。如果你这样做

const char *p = "Hello World!";
cout << p;

重载的<<版本确保"Hello World!"字符串本身被发送到输出,而不是指针值。

这正是使您的代码输出整个字符串的原因。由于C ++ 11 std::string对象需要将其数据存储为以零结尾的字符串,&a[0]只是指向存储在a对象中的字符串开头的指针。

答案 1 :(得分:1)

当打印指向标准库输出流的指针时,如果它是char*const char*,则将打印指向的以null结尾的字符串,而不是地址本身。如果您想打印地址:

cout << static_cast<const void*>(&a[0]);

(Trivia:如果指针类型不能转换为const void* ---因为它是一个函数指针或指向成员的指针,或者它是易失性的 - 那么它将被转换为{ {1}}。)

答案 2 :(得分:1)

&a[0]会产生类型char*。这是operator<<()重载的类型。此特定重载打印从地址开始的字符,直到找到空字符'\0'。它不会像你期望的那样打印地址。

由于您需要地址,标准库中有std::addressof()

std::cout << std::addressof(a[0]);

你也可以转发void*,这几乎就像上面的变种一样:

std::cout << static_cast<void*>(&a[0]);