0

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

假设我有
IPCimstream ims;

1.印刷有什么区别

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


2。

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

如果可能,请举例说明。假设 ims.dataBuf() 具有“Hello world\n”等或其他您认为可以很好地解释差异的示例。抱歉,我是输入流的新手,如果有的话,我想不出更多有趣的例子。

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

4

1 回答 1

3

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

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

你看,这种行为与类无关IPCimstream,它只是如何cout工作。(查看http://ideone.com/1ErtV上的示例)。

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

void*版本不知道如何处理指针指向的值——所以它自己输出指针值(即地址)。

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

于 2012-05-02T16:04:51.077 回答