string a = "asdf";
cout<<&a[0];
cout<<a[0];
为什么这两个输出有所不同?为什么&a[0]
不是地址而是整个字符串?
答案 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]);