【问题标题】:"cout" and "char address" [duplicate]“cout”和“char地址”[重复]
【发布时间】:2021-08-08 12:15:59
【问题描述】:
char p;
cout << &p;

这不会打印字符 p 的地址。它打印一些字符。为什么?

char p;
char *q;
q = &p;
cout << q;

即使这样也没有。为什么?

【问题讨论】:

  • &amp;p 等同于char*&lt;&lt; 运算符具有特殊的重载,可将char* 视为以空值结尾的 C 字符串。
  • printf 在这里更加优雅。 printf("%p\n", (void *)pointer);

标签: c++ char cout


【解决方案1】:

我相信&lt;&lt; 运算符将其识别为字符串。将其转换为 void* 应该工作:

cout << (void*)&p;

std::basic_ostream 有一个专门的运算符,它接受std::basic_streambuf(基本上一个字符串(在这种情况下)):

_Myt& operator<<(_Mysb *_Strbuf)

与接受任何指针的运算符相反(当然char* 除外):

_Myt& operator<<(const void *_Val)

【讨论】:

    【解决方案2】:

    std::cout 会将char* 视为字符串。您基本上可以在未初始化指针的位置看到内存中包含的任何内容 - 直到遇到终止的空字符。如果需要查看,将指针转换为 void* 应该打印实际的指针值

    【讨论】:

      【解决方案3】:

      这是因为指向char 的指针有自己的&lt;&lt; 重载,它指针解释为C 字符串。

      您可以通过向void* 添加强制转换来修复您的代码,这是打印指针的重载:

      char p;
      cout << (void*)&p << endl;
      

      Demo 1.

      请注意,char 指针会出现问题,但其他类型的指针不会。比如说,如果你在声明中使用 int 而不是 char,你的代码可以在没有强制转换的情况下工作:

      int p;
      cout << &p << endl;
      

      Demo 2.

      【讨论】:

        猜你喜欢
        • 2014-05-17
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 2016-08-25
        • 2011-06-26
        • 1970-01-01
        相关资源
        最近更新 更多