什么是共用体

  • 和结构体不同的是,结构体的每个成员都是占用一块独立的存储空间,而共用体所有的成员都占用同一块存储空间
  • 和结构体一样,共用体在使用之前必须先定义共用体类型,再定义共用体变量。

    定义共用体类型

    1. union 共用体名{
    2. 数据类型 属性名称;
    3. 数据类型 属性名称;
    4. ......
    5. };

    特点: 由于所有属性共享同一块内存空间,所以只要其中一个属性发生了改变,其它的属性都会受到影响

定义共用体类型变量

  1. union 共用体名 共用体变量名称;

示例

  1. #include <stdio.h>
  2. union Person {
  3. char ch;
  4. int age;
  5. };
  6. int main() {
  7. union Person p1;
  8. printf("sizeof = %i\n", sizeof(p1)); // 4
  9. p1.age = 25;
  10. printf("p1.age = %i\n", p1.age); // 25
  11. p1.ch = 'a';
  12. printf("p1.ch = %c\n", p1.ch); // a
  13. printf("p1.age = %i\n", p1.age); // 97
  14. return 0;
  15. }

应用场景

  • 通信中的数据包会用到共用体,因为不知道对方会发送什么样的数据包过来,用共用体定义几种格式的包,收到包之后就可以根据包的格式取出数据。
  • 节约内存。如果有2个很长的数据结构,但不会同时使用,比如一个表示老师,一个表示学生,要统计老师和学生的情况,用结构体就比较浪费内存,这时就可以考虑用共用体来设计。
  • 某些应用需要大量的临时变量,这些变量类型不同,而且会随时更换。而你的堆栈空间有限,不能同时分配那么多临时变量。这时可以使用共用体让这些变量共享同一个内存空间,这些临时变量不用长期保存,用完即丢,和寄存器差不多,不用维护。