0

这段代码:

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中给出了值(而不是地址)。

我有什么误解?

4

6 回答 6

6

这是因为它的std::cout::operator <<定义方式——它有一个重载,它接受 aconst char*并打印它指向的字符串。如果你想要地址,你必须投到void*.

于 2013-04-09T11:28:49.577 回答
4

“我误会了什么?” <<上的定义char const*。指针是按值传递的,但 的定义 operator<<( std::ostream&, char const* )指定它将指针视为'\0'终止字符串的开始。

于 2013-04-09T11:29:53.523 回答
2

该变量c_str1是指向字符串中第一个字符的指针。&c_str1是指向的指针c_str1(即指向指针的指针)。*c_str1是指向的位置的值c_str1(即只有一个字符)。

输出运算符有一个重载,它接受一个指向字符(是什么c_str1)的指针并将其打印为字符串。

于 2013-04-09T11:30:39.907 回答
1

for有一个重载ostream& operator<<const char*,它假定指针指向空终止字符串中的第一个字符,并打印整个字符串。

您可以在此处不应该应用的地方看到此假设的示例:

#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)
}
于 2013-04-09T11:29:14.600 回答
1

operator<< (ostream, char*)该标准指定了输出存储在指针中的字符串的重载。换句话说,c_str1确实是一个指针,但输出流将它解释为它指向的字符串。

要输出指针值,请将其转换为void*

cout << "The C-style string c_str1 is: " << static_cast<void*>(c_str1);
于 2013-04-09T11:29:22.273 回答
0

cout 运算符<< 将指向 char 的指针解释为 C 字符串。

于 2013-04-09T11:30:19.893 回答