【问题标题】:why pointer to char behaves differently as compared to pointersof other data types为什么指向 char 的指针与其他数据类型的指针的行为不同
【发布时间】:2013-03-27 10:13:20
【问题描述】:

我对以下陈述有疑问;

int intvalue = 3;
int *pointInt = &intvalue;

char* p = "string";
cout << pointInt << std::endl;  // this will give memory location of intvalue which is ok.
cout << p<< std::endl; // why this will give string value  rather than memory location of where string is stored?

【问题讨论】:

  • 由于运算符重载&lt;&lt;
  • 我编辑了标题;问题是关于char*,而不是指向char* 的指针。

标签: c++ pointers char


【解决方案1】:

因为有一个overload of std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const char*),它假定char*null-terminated string 的第一个元素并打印出整个字符串。

您可以通过尝试流式传输char* 来获得很多乐趣,该char* 不是空终止字符串的第一个元素:

#include <iostream>
int main()
{
  char c = 'x';
  std::cout << &c << std::endl;
}

【讨论】:

  • 你有一个奇怪的 --- 甚至可能会说 undefined -- 有趣的概念。
  • @JimBalter 一个人可能会花费数小时运行该代码并查看出现的漂亮符号......
【解决方案2】:

char*const char* 最常用于指向 C 风格的以空字符结尾的字符串。标准 I/O 库在传递其中一种类型以插入或提取时考虑了这一点。根据想要打印出 C 样式字符串的常见程度,这些函数被简单地设计为具有这种特殊情况。

要获取指针值,可以尝试转换为不同的指针类型:

std::cout << static_cast<void*>(p) << std::endl;

【讨论】:

    【解决方案3】:

    关键字运算符重载- iostream 实例std::cout 的另一种方法负责处理字符并以不同方式处理。确切的实现也可以产生“Hello World”

    【讨论】:

      【解决方案4】:
      cout << (void *) p << std::endl;
      

      我希望这是因为&lt;&lt; 运算符对char* 参数有一个特定的覆盖,以输出字符串。

      【讨论】:

        【解决方案5】:

        这是 cout 对象类型的 operator&lt;&lt;() 重载作为第一个参数,char*const char* 作为第二个参数。

        有很多这样的重载,你也可以写一些。

        这种特殊重载的原因是“打印”C 风格的字符串(以空字符结尾的字符数组)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-05
          • 2011-12-16
          • 2016-01-27
          • 2017-09-03
          • 2021-11-26
          • 2021-04-17
          • 2011-08-10
          相关资源
          最近更新 更多