相同类型的数据集合在一起可以用数组;--->每个成员占用不同的内存空间
不同类型的数据集合在一起可以用结构体;--->每个成员占用不同的内存空间
不同类型的数据放在同一段内存单元上,使用共用体。--->每个成员占用同一段的内存空间----->省内存空间
例如:结构体
struct student{
char name[10];
int age;
float length;
};
共用体:
union student{
char name[10];
int age;
float length;
};
共用体所占内存字节数与其成员中占字节数最多的那个成员相等。
共用体变量不能进行初始化;
只能对成员进行单独赋值:
union student stt;
stt.age = 19;
stt.length = 1.76;
printf("%d",stt.age);------------------->最后的值,是length成员的值,故会将1.76 取整,
共用体只能引用共用体变量的成员。有三种形式:
共用体变量名.成员名
共用体指针->成员名
(*共用体指针).成员名
共用体变量中起作用的是最近一次存入的成员变量的值,原有的成员变量的值将被覆盖。
例如:
利用共用体取出int变量的高字节和低字节的数据
union student{
int a;
char ch[2];
}stt;
stt.a=0x4321;
printf("%x,%x",stt.ch[0],stt.ch[1]); //分别对应21 43
通信中的数据包会用到共用体。
因为不知道对方会发一个什么包过来,用共用体的话就很简单了,定义几种格式的包,收到包之后就可以直接根据包的格式取出数据。
总结:数据类型为int和char[]的形式,可以将赋值的int值的各个字节通过char数组取出来,这种方式在串口通信中经常使用。
例1:
union student{
unsigned int a;
unsigned char c;
}stt;
stt.c='A';
printf("%c",stt.a); //输出时A
//一个字节,放在低位。
参考字节序的转换https://blog.csdn.net/modi000/article/details/108484846
例2:我们经常使用共用体来获取一个int数据类型的中的各个字节
typedef struct{
uint32_t aa:8;
uint32_t bb:8;
uint32_t cc:8;
uint32_t dd:8;
}STRTEST;
uinon MYUNION{
STRTEST str;
uint32_t value;
};
uinon MYUNION mm;
//1)为 uint32_t数据类型赋值,取各个字节的数;
mm.value = 0x12345678;
mm.str.aa = 0x78;
mm.str.bb = 0x56;
mm.str.cc = 0x34;
mm.str.dd = 0x12;
//2)给各个字节赋值,取uint32_t的值---->按照小端序的话,是如下的value
mm.str.aa = 0x78;
mm.str.bb = 0x56;
mm.str.cc = 0x34;
mm.str.dd = 0x12;
mm.value = 0x12345678;