共用体

语法

union 共用体名{  
    成员列表  
}; 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。 例如:

union test{
    unsigned int a;
    unsigned int aa;
    unsigned short b;
    unsigned char c;
}; 共用体test所占内存大小是最大的成员变量的大小,即`sizeof(test) = sizeof(unsigned int) = 4`。a和aa长度相等,所占内存空间也相等,对这两个变量的读写是等效的。读写b相当于读写a的最后两个字节,c同理。

应用

定义欧拉角类型

typedef struct{
    float yaw;
    float pitch;
    float rol;
} eulr_vector_t; 定义角度类型

typedef float angle_t; 定义联合体

typedef union{
    eulr_vector_t eulr;
    angle_t angle[3];
}eulr_angle_t;

eulr_angle_t data; 使用eulr_angle_t变量,可以像数组一样遍历每个元素

for(int i=0;i<3;i++)do_something(data.angle[i]); 也可以靠名字单独访问某个元素

do_something(data.eulr.pitch);