联合体的应用
联合体在一般中的编程应用中还是很少的,在单片机编程中较多,在之前的文章《枚举和结构体的结合》将枚举和结构体的结合,下面的例子简单说明下联合体在结构体中的应用(我的日常开发中联合体一般都是和结构体一起使用的)。 在做显示屏应用时牵扯到一个概念,显示屏(全彩)上一个像素点是由于Red,Green,Blue三种颜色组成,在888模式下,每个像素点都是由8个bit组成的,这个时候为了便是一个像素点就需要用到结构体,这也对应前面的文章,结构体就像是打包封装,把一些有共同特征的变量封装在内部。 typedef struct{
uint8_t Red;
uint8_t Green;
uint8_t Blue;
uint32_t Pix_Value;
}LCD_Pixvalue_S;
上面这样的写法是十分清晰的,访问很方便,可以单独访整个像素,也可以访问像素的某个颜色,有个问题那就是我操作红色像素,需要重新给Pix_Value成员赋值,如下
LCD_Pixvalue_S LCD_Pixvalue;
LCD_Pixvalue.Red = 0x12;
LCD_Pixvalue.Pix_Value = LCD_Pixvalue.Red<<16 | LCD_Pixvalue.Red<<8 |LCD_Pixvalue.Blue;
需要多一句代码,并且内存占用也大。当然,直接用下面写法,不会多占用内存,但是访问不方便。 typedef struct{
uint32_t Pix_Value;
}LCD_Pixvalue_S;
那么这个时候,使用联合体和结构体组合起来,就可以既不会多占内存,访问也很方便。
typedef union{
struct{
uint8_t Red;
uint8_t Green;
uint8_t Blue;
}Pix;
uint32_t Pix_Value;
}LCD_Pixvalue_S;
那么就可以如下操作 LCD_Pixvalue_S LCD_Pixvalue;
uint32_t data;
LCD_Pixvalue.Pix_Value = 0x0012FF00;
LCD_Pixvalue.Pix.Red = 0x25;//单独修改红色
data = LCD_Pixvalue.Pix_Value;//data的值就为0x0025FF00
当然,结构体的定义你也可以写到外面,其他地方可以使用,如下 typedef struct{
uint8_t Red;
uint8_t Green;
uint8_t Blue;
}Pix_s;
typedef union{
Pix_s Pix;
uint32_t Pix_Value;
}LCD_Pixvalue_S;
那么关于内存占用的问题,上面的定义方法,定义一个LCD_Pixvalue_S类型的变量占用4个字节。示例图如下
|