【问题标题】:Why pointer returns value and not address?为什么指针返回值而不是地址?
【发布时间】:2013-04-09 11:26:54
【问题描述】:

这段代码:

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

我误会了什么?

【问题讨论】:

  • &amp;c_str1 将是指针的地址。你在想*c_str1,但那只会给你第一个char。
  • @larsmans,我认为&amp;x 给出了普通变量x 的地址,而“指针地址”很奇怪,因为指针已经是一个地址。
  • 稍微简化一下,指向T 的指针是一个包含地址的变量。该变量必须存在于某个地方,因此它也有一个地址,类型为T**(指向T 的指针)。

标签: c++ string pointers c-str


【解决方案1】:

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

【讨论】:

  • 我会说“指定”,而不是“实施”。它是这样实现的,因为这是标准指定的方式。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      cout << "The C-style string c_str1 is: " << static_cast<void*>(c_str1);
      

      【讨论】:

        【解决方案5】:

        有一个overload of ostream&amp; operator&lt;&lt; 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)
        }
        

        【讨论】:

          【解决方案6】:

          cout 运算符

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-09-09
            • 2021-04-04
            • 1970-01-01
            • 1970-01-01
            • 2021-04-01
            • 2020-08-29
            • 1970-01-01
            • 2011-12-07
            相关资源
            最近更新 更多