有没有什么方法可以创建两个指向相同内存位置的变量,这样我可以读取与int,float,char相同的内存,以及我喜欢的任何方式?
我想要这样的东西,只是没有指向f的指针,所以每次读/写f时我都不需要取消引用。
char myArray[100];
float* f = (float *)&myArray[10];
我想在C中最接近C ++的引用。
我希望这个问题有道理。
编辑:我从闪存中读取流(4 Kb)的字节。此流包含短路,整数和浮点数。我知道这些整数和浮点数在阵列中的位置。我想读/写前面提到的int和浮点数,就像它们是普通变量一样。
答案 0 :(得分:2)
此示例将数据读入预定义的struct
,打包(如有必要)。小心endian-ness!数据类型:您的目标上的int
可能是您的PC上的short
。
#include<stdio.h>
#pragma pack(push, 1)
struct mydata {
int version;
char title[16];
float reading[8];
} mydata;
#pragma pack(pop)
int main(void)
{
FILE *fp;
struct mydata data = {0};
fp = fopen("mydata.bin", "rb");
if (1 != fread(&data, sizeof(data), 1, fp))
{ // error
}
printf("Version = %d\n", data.version);
fclose(fp);
return 0;
}
答案 1 :(得分:1)
这就是联盟存在的原因。
union u {
char c[4];
float f;
int i; // assuming sizeof(int) = 4 for this example
};
union u cf;
cf.f = 1.;
int i = cf.i;
请注意,由于严格的别名,最后一行实际上不符合C标准。请参阅示例What is the strict aliasing rule?您应始终通过char
l值访问二进制表示。