为什么指针返回值而不是地址?

时间:2013-04-09 11:26:54

标签: c++ string pointers c-str

此代码:

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

我误解了什么?

6 个答案:

答案 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_str1c_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字符串。