C 语言 - 共用体

C 共用体

共用体类似于结构体,因为它可以存储不同数据类型的成员。

但是,它们之间存在一些差异:

  • 在结构体中,每个成员都有自己的内存。
  • 在共用体中,所有成员共享同一块内存,这意味着您一次只能使用其中一个值。

大多数时候,您会使用结构体而不是共用体,因为它可以同时存储和访问多个值,这在日常程序中更为常见。

然而,当您一次只需要存储几种可能类型中的一种,并且希望节省内存时,共用体就很有用。

声明共用体

要创建共用体,请使用 union 关键字,然后从中创建一个变量(就像结构体一样):

实例

union myUnion {        // 共用体声明
  int myNum;           // 成员 (int)
  char myLetter;       // 成员 (char)
  char myString[30];   // 成员 (char 数组)
}; 

int main() {
  union myUnion u1;  // 创建一个名为 "u1" 的共用体变量
  return 0;
}

访问共用体成员

与结构体一样,要访问共用体的成员,请使用点 . 语法。

重要提示:由于所有成员共享同一块内存,更改一个成员会影响其他成员。只有最后赋值的成员才持有有效值:

实例

union myUnion {
  int myNum;
  char myLetter;
  char myString[30];
};

int main() {
  union myUnion u1;

  u1.myNum = 1000;

  // 因为这是最后写入共用体的值,所以 myNum 不再持有 1000 - 其值现在无效
  u1.myLetter = 'A';

  printf("myNum: %d\n", u1.myNum); // 此值不再可靠
  printf("myLetter: %c\n", u1.myLetter); // 输出 'A'

  return 0;
}

亲自试一试

共用体的大小

共用体的大小始终与其最大成员的大小相同:

实例

union myUnion {
  int myNum;
  char myString[36];
};

int main() {
  union myUnion u1;
  printf("Size of union: %zu bytes\n", sizeof(u1));
  return 0;
}

亲自试一试

由于最大的成员是 36 字节,整个共用体也将是 36 字节

如果这是一个结构体,大小将是 40 字节:

myNum (4 字节) + myString (36 字节) = 总共 40 字节

何时使用共用体

在以下情况下使用共用体:

  • 您需要在同一位置存储不同的类型
  • 您一次只使用一种类型
  • 节省内存非常重要