1、为什么要用共用体:
1.节省空间
2.实现数据的转换
运行内存----------内存条,存储的空间--------硬盘
2、语法
union 结构体名
{
数据类型 变量名1;
数据类型 变量名2;
数据类型 变量名3;
};
union demo
{
char a;
int b ;
short c;
}; //定义
union demo d; //声明
3、数据如何存放和读取
数据存放
在给union中赋值的时候,因为共用同一个内存空间,所以会涉及到数值覆盖的情况,下面举例:
typedef union
{
char i;
int j;
short k;
}eg_t;
int main()
{
eg_t eg;
eg.i = 'A';
printf("%#x\n",eg.i);
eg.j = 0x12345678;
printf("%#x\n",eg.j);
eg.k =0x3476;
printf("%#x\n",eg.k);
printf("%#x\n",eg.j);
}
结果:
0x41
0x12345678
0x3476
0x12343476
数据读取
union中的成员共用同一块空间,空间内存由成员最大类型决定,当变量获取数据时均从公用的空间内存取数据
比如下面的代码中,存放数据d1首位int型,所以按照内存格式存放数据,存放为:78 56 34 12(小端),所以a的取值为第一个字节0x78,以此类推。
union demo1
{
int b ;
char a;
short c;
};
int main()
{
union demo1 d1={0x12345678};
printf("a = %#x\n",d1.a);
printf("b = %#x\n",d1.b);
printf("c = %#x\n",d1.c);
printf("pa = %p \n",&d1.a);
printf("pb = %p \n",&d1.b);
printf("pc = %p \n",&d1.c);
isLittleEndian();
}
输出:
a = 0x78
b = 0x12345678
c = 0x5678
pa = 0x7ffddcf39094
pb = 0x7ffddcf39094
pc = 0x7ffddcf39094
根据union判断大小端
弄清数据如何存放后,可根据union存放原理判断大小端
union demo
{
int a;
char b;
short c;
};
int isLittleEndian(void)
{
union demo d={1};
if(d.b == 1)
printf("this is little Endian\n");
else printf("this is big endian\n");
}
实现数据的转换
允许在相同的内存位置存储不同的数据类型,可以直接调用成员变量进而实现数据类型的转换
#include <stdio.h>
union DataConverter {
int integer;
float floatingPoint;
};
int main() {
union DataConverter myUnion;
// 向浮点数成员赋值
myUnion.floatingPoint = 3.14;
// 访问整数成员
printf("Integer value: %d\n", myUnion.integer);
// 访问浮点数成员,由于共用体的内存共享,可以进行类型转换
printf("Floating-point value: %f\n", myUnion.floatingPoint);
return 0;
}
输出结果:
Integer value: 1078523331
Floating-point value: 3.140000
注意事项
- 共用体初始化只能给一个值,且默认为赋值给第一个成员变量
- 各个成员起始位置相同,但是根据类型不同,能拿到的字节数不同
- 共用体成员可以赋值最终共用体的值,取决于最后一次给到的值,以及最后一次能影响到的字节数