2

我对以下陈述有疑问;

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?
4

5 回答 5

5

因为存在 的重载std::ostream& operator<<(std::ostream&, const char*),它假定是以空字符结尾的字符串char*的第一个元素并打印出整个字符串。

通过尝试流式传输不是以 null 结尾的字符串的第一个元素的 a char*,您可以获得很多乐趣:

#include <iostream>
int main()
{
  char c = 'x';
  std::cout << &c << std::endl;
}
于 2013-03-27T10:14:59.173 回答
3

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

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

std::cout << static_cast<void*>(p) << std::endl;
于 2013-03-27T10:16:17.157 回答
1

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

于 2013-03-27T10:15:29.207 回答
0
cout << (void *) p << std::endl;

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

于 2013-03-27T10:15:59.320 回答
0

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

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

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

于 2013-03-27T10:16:25.550 回答