2013-03-27 83 views
2

我对以下数据有怀疑;为什么指向char的指针与其他数据类型的指针相比表现不同

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? 
+1

由于重载操作的''<<我 – aragaer 2013-03-27 10:15:30

+0

编辑的标题;问题是关于'char *',而不是指向'char *'的指针。 – 2013-03-27 11:15:10

回答

5

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

您可以通过尝试后流char*一个空值终止字符串的第一个元素有很多乐趣:

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

你有一个奇怪的---甚至可能会说*未定义* - 乐趣的概念。 – 2013-03-27 10:36:49

+0

@JimBalter可以花几个小时运行该代码并查看出现的漂亮符号...... – juanchopanza 2013-03-27 10:38:37

1

关键字操作符重载 - 是iostream实例只是另一种方法std::cout负责不同的字符和句柄。确切的实施也可能会产生的“Hello World”

0
cout << (void *) p << std::endl; 

我希望这是因为<<运营商有char*参数特定覆盖,输出字符串。

3

char*const char*最常用于指向C样式空终止的字符串。标准I/O库在传入其中一种类型的插入或提取时考虑到这一点。这些函数只是基于想要打印出C风格的字符串的常见程度而设计的。

得到的指针值,你可以尝试强制转换为不同的指针类型:

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

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

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

而对于这个特定的过载的原因是为了“打印” C风格串(炭的空值终止阵列)

相关问题