我有一个输入流IPCimstream,它使用dataBuf()函数返回指向其流的字符缓冲区的指针。
说我有 IPCimstream ims;
印刷之间有什么区别 1.
cout << ims.dataBuf() << endl;
和
2.
cout << (void*)ims.dataBuf() << endl;
如果可能,请用一个例子来解释。假设ims.dataBuf()有&#34; Hello world \ n&#34;等等或其他你觉得解释差异的例子。对不起,我是输入流的新手,如果可能的话,我无法想出更多有趣的例子。
另外,如果IPCimstream是字符流与二进制流,那将会有什么不同。谢谢。
答案 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
在开头,则没有任何内容),并且使用强制转换,您只需将缓冲区的地址输出作为字符串。