【C语言】【union联合体】


Union,即联合体,将几种数据类型联合起来的一种数据结构,且共用同一个内存空间。
例如,用24bit表示一个像素点,包含 RED、GREEN、BLUE,每种颜色8bit。使用联合体便可以定义如下:
typedef union {

  struct __attribute__ ((packed)) {
    uint8_t r, g, b;
  };

  uint32_t rgb;

} rgb_color;

上述的union包含了一个结构体和一个无符号整型数据,当需要某一种颜色时可以单独调用结构体里面的值;当需要整个像素的值时就可以调用rgb的值。
Alt
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);
}

代码执行结果如下:
Alt
利用这个特性,可以在数据传输时候,对数据进行拆分。比如将一个四字节的int数据(rgb),拆分为四个无符号字符。


参考资料
C语言之联合体(union)

发布了30 篇原创文章 · 获赞 12 · 访问量 8262

猜你喜欢

转载自blog.csdn.net/syjie19900426/article/details/98631504