带和不带 (void*) 的 COUT 输入流

cout input stream with and without (void*)

本文关键字:COUT 输入流 void      更新时间:2023-10-16

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

说我有
IPCimstream ims;

打印
有什么区别1.

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


阿拉伯数字。

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

如果可能,请用一个例子解释。假设ims.dataBuf((有"Hello world"等,或者你觉得可以很好地解释差异的其他例子。抱歉,我是输入流的新手,如果有的话,我无法想出更有趣的例子。

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

不同之处在于cout::operator<<的重载char*指针被视为以零结尾的 C 字符串(好吧,C 字符串无论如何都只是字符指针(,因此它输出字符串本身。如果你的缓冲区不是以零结尾的字符串,cout的猜测是错误的,所以它会输出一些随机垃圾,直到第一个

同一运算符的void*版本不知道指针后面的对象是什么,所以它所能做的只是输出指针值。

你看,这种行为与IPCimstream无关,这只是cout的工作方式。(请看 http://ideone.com/1ErtV 的例子(。

编辑:
如果dataBuf包含"Hello worldn"char*版本将指针解释为以零结尾的字符串。因此,它将输出字符"Hello world",输出换行符,并且比n后直到下一内存中的所有字符。如果内存中没有这样的字符,程序可能会崩溃。(对于语言纯粹主义者:你会得到不确定的行为

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

编辑 2:
字符流和二进制流之间的区别可能仅在于它们保存的数据。在任何情况下,如果dataBuf()返回一个char*cout将输出缓冲区中找到的所有字符(并且可能超出缓冲区(,直到第一个(或者如果在开头,则什么都没有(,并且使用强制转换,您将只获得缓冲区的地址输出为字符串。