cout输入流有和没有(void *)

时间:2012-05-02 16:00:53

标签: c++ input stream void cout

我有一个输入流IPCimstream,它使用dataBuf()函数返回指向其流的字符缓冲区的指针。

说我有 IPCimstream ims;

印刷之间有什么区别 1.

cout << ims.dataBuf() << endl;   


2.

cout << (void*)ims.dataBuf() << endl;

如果可能,请用一个例子来解释。假设ims.dataBuf()有&#34; Hello world \ n&#34;等等或其他你觉得解释差异的例子。对不起,我是输入流的新手,如果可能的话,我无法想出更多有趣的例子。

另外,如果IPCimstream是字符流与二进制流,那将会有什么不同。谢谢。

1 个答案:

答案 0 :(得分:3)

嗯,区别在于char*的{​​{1}}重载将指针视为零终止的C字符串(好吧,C字符串 只是char指针),所以它输出字符串本身。如果你的缓冲区不是一个以零结尾的字符串,那么cout::operator<<的猜测是错误的,所以它会输出一些随机垃圾直到第一个cout

同一运算符的\0版本不知道指针后面的对象是什么,所以它所做的一切就是输出指针值。

你知道,这种行为 void*类相关联,这就是IPCimstream的工作原理。 (请看http://ideone.com/1ErtV处的示例。)

编辑:
如果cout包含dataBuf "Hello world\n"版本,则将指针解释为以零结尾的字符串。因此,它将输出字符“Hello world”,输出换行符,以及char*之后恰好位于内存中的所有字符,直到下一个\n。如果内存中没有这样的字符,程序可能会崩溃。 (对于语言纯粹主义者:你会得到未定义的行为。)

\0版本不知道如何处理指针指向的值 - 因此它输出指针值(即地址)本身。

编辑2:
字符流和二进制流之间的差异可能仅在于它们所持有的数据。在任何情况下,如果void*返回dataBuf()char*将输出在缓冲区中找到的所有字符(可能超出它),直到第一个cout(或仅如果\0在开头,则没有任何内容),并且使用强制转换,您只需将缓冲区的地址输出作为字符串。