C ++ newbie here。
我正在试图找出将缓冲区写入文件的以下行:
fOut.write((char *)&_data, sizeof(_data));
_data =整数数组......
我有几个问题:
&_data
是数组第一个元素的地址吗?sizeof(_data)*arrLength
吗?传递int的大小(在本例中)是什么意思,而不是整个数组的大小?char*
意味着什么?我真的很感激一些澄清。
答案 0 :(得分:6)
与您的评论相反,数组必须是自动或静态存储持续时间才能使sizeof
正常工作。
应该只是(char*)_data
。数组的名称隐式转换为指向第一个元素的指针。
不,write
需要指针,并存储在该位置找到的内容,而不是位置的地址。
没有。由于_data
是一个数组,sizeof (_data)
是数组中所有元素的累积大小。如果_data
是指针(例如在堆上动态分配数组时),则需要numElems * sizeof(_data[0])
。将指针的大小乘以元素的数量是没有用的。
这意味着该地址的内容将被视为一系列单独的字节,从而失去了它可能具有的任何数字含义。通常这样做是为了从文件或memcpy
/ memmove
执行数据的高效批量复制。数据类型应为POD(普通旧数据),否则您将获得意外结果。
如果_data
是指向从堆分配的数组的指针,正如您的注释所示,那么代码就会被严重破坏。在这种情况下,您只保存地址,如果您将文件加载回程序的同一个实例,它可能会起作用,但这仅仅是因为它在同一地址的内存中查找数据。数据实际上不在文件中,如果在加载文件之前重新启动程序,则会发现数据已消失。进行我在(1)和(3)中提到的更改,以便保存完整的数组,无论它是自动,静态还是动态分配。
答案 1 :(得分:1)
铸造成char *意味着什么 在处理地址时?
想象一下这个简单的例子
int x = 12;
char * z = (char *)&x;
并假设int
长度为4个字节的架构。来自C ++标准sizeof(char)==1
。
在表达式char * z
char *
部分,您可以说它用于指针运算
在我给出的示例的第二行,会发生的事情是z
现在指向x
具有的第一个(4个字节中)。执行++z;
会使z
指向(在我的示例中)4字节int
你可以说声明的左边部分用于指针算术,以简化操作。 a ++(char *)
会移动一个字节,而++(int *)
会移动你占用内存的相应字节数int
。
答案 2 :(得分:0)
答案 3 :(得分:0)
是& _data到数组第一个元素的地址吗?
是的,确实如此。 这是在C和C ++中将“引用”传递给数组的常用方法。如果您将数组本身作为参数传递,则会复制整个数组内容,这通常是浪费和不必要的。 更正:您可以传递&_data
,或只是_data
。无论哪种方式,都不需要将数组复制到堆栈中。
无论地址是什么,这是否意味着我们只保存数组的地址?那么为什么我从内存中删除他后仍然可以访问数组?
不,该方法使用它获取的地址来读取数组内容;正如你所指出的,只是保存内存地址毫无意义。
我不应该传递sizeof(_data)* arrLength吗?我的意思是... 传递大小的逻辑是什么 int(在这种情况下)而不是大小 整个阵列?
不,sizeof(_data)
是数组的大小,而不是一个成员的大小。无需乘以长度。
在处理地址时,铸造成char *意味着什么?
转换为char *表示该数组作为字节列表进行访问;这是访问和写入原始值所必需的。
答案 4 :(得分:0)
1)是的,& _data是数组第一个元素的地址 2)否,write()通过sizeof(_data)从地址& _data开始写入您指定的数字字节。 3)如果_data是一个指针,你可以将sizeof(int)* arrLength传递给一个数组,但由于它是一个数组sizeof()返回正确的大小。 /> 4)不知道。 ;)
答案 5 :(得分:0)
请阅读:http://www.cplusplus.com/reference/iostream/ostream/write/
顺便说一句,它只适用于内部具有简单值的简单数组......
我建议您查看>> <<运营商。