此代码:
string str1 ( "Hello world" );
const char *c_str1 = str1.c_str ( );
cout << "The C-style string c_str1 is: " << c_str1
生成此输出:
The C-style string c_str1 is: Hello world
我不明白。
c_str1
是一个指针,对吗?因此,c_str1
应该返回一个地址,只有*c_str1
应该给出位于此地址的值。但是,在上面的示例中,c_str1
给出了值(而不是地址)。
我误解了什么?
答案 0 :(得分:6)
这是因为定义std::cout::operator <<
的方式 - 它有一个带有const char*
的重载并打印它指向的字符串。如果您想要地址,则必须转换为void*
。
答案 1 :(得分:4)
“我误解了什么?” <<
上char
const*
的定义。指针按值传递,但定义为
operator<<( std::ostream&, char const* )
指定它
将指针视为'\0'
终止字符串的开头。
答案 2 :(得分:2)
变量c_str1
是指向字符串中第一个字符的指针。 &c_str1
是指向c_str1
的指针(即指向指针的指针)。 *c_str1
是c_str1
指向的位置的值(即只有一个字符)。
输出运算符有一个重载,它接受指向一个字符的指针(c_str1
是什么)并将其打印为字符串。
答案 3 :(得分:1)
有一个overload of ostream& operator<<
for const char*
,它假定指针指向null terminated string中的第一个字符,并打印整个字符串。
你可以看到这个假设的一个例子应用于它不应该在这里:
#include <iostream>
int main()
{
char c = 'x'; // not a null terminated string
std::cout << &c << std::endl; // will write until it finds a 0 (really UB)
}
答案 4 :(得分:1)
标准指定operator<< (ostream, char*)
的重载,它输出存储在指针中的字符串。换句话说,c_str1
确实是一个指针,但输出流将其解释为它指向的字符串。
要输出指针值,请将其强制转换为void*
:
cout << "The C-style string c_str1 is: " << static_cast<void*>(c_str1);
答案 5 :(得分:0)
cout运算符&lt;&lt;将指向char的指针解释为C字符串。