Union,即联合体,将几种数据类型联合起来的一种数据结构,且共用同一个内存空间。
例如,用24bit表示一个像素点,包含 RED、GREEN、BLUE,每种颜色8bit。使用联合体便可以定义如下:
typedef union {
struct __attribute__ ((packed)) {
uint8_t r, g, b;
};
uint32_t rgb;
} rgb_color;
上述的union包含了一个结构体和一个无符号整型数据,当需要某一种颜色时可以单独调用结构体里面的值;当需要整个像素的值时就可以调用rgb的值。
union的元素共用一个内存空间,其大小以最大的元素所占的空间为准。故上图所示,我们定义的 rgb_color 联合体占用 4字节空间。
因为是占用的同一个内存空间,所以我们无论修改 rgb 或 r/g/b 的任何值都会同时影响其他的值(小端存储)。举个栗子:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
typedef union {
struct __attribute__ ((packed)) {
uint8_t r, g, b;
};
uint32_t rgb;
} rgb_color;
void main()
{
rgb_color color;
color.r = 0x12;
color.g = 0x34;
color.b = 0x56;
printf("%x\n", color.r);
printf("%x\n", color.g);
printf("%x\n", color.b);
printf("%x\n", color.rgb);
printf("After re-assign value for g: \n\n");
color.g = 0x78;
printf("%x\n", color.r);
printf("%x\n", color.g);
printf("%x\n", color.b);
printf("%x\n", color.rgb);
printf("After re-aasign value for rgb: \n\n");
color.rgb = 0xabcdefed;
printf("%x\n", color.r);
printf("%x\n", color.g);
printf("%x\n", color.b);
printf("%x\n", color.rgb);
}
代码执行结果如下:
利用这个特性,可以在数据传输时候,对数据进行拆分。比如将一个四字节的int数据(rgb),拆分为四个无符号字符。
参考资料
C语言之联合体(union)