C 教程

C 教程 C 语言简介 C 下载安装和环境配置 C 快速入门 C 语法 C 输出 C 注释 C 变量 C 数据类型 C 常量 C 运算符 C 布尔值 C If...Else 语句 C Switch 语句 C While 循环 C For 循环 C Break/Continue 语句 C 数组 C 字符串 C 用户输入 C 内存地址 C 指针

C 函数

C 函数 C 函数参数 C 作用域 C 函数声明 C 递归 C 数学函数

C 文件

C 创建文件 C 写入文件 C 读取文件

C 结构体

C 结构体 C 嵌套结构体 C 结构体和指针 C 联合体 C typedef

C 枚举

C 枚举

C 内存

C 内存管理

C 错误

C 错误 C 调试 C 空值 C 错误处理 C 输入验证

C 更多

C 日期 C 随机数 C 宏 C 代码组织 C 存储类 C 位运算符 C 固定宽度整数

C 项目

C 项目

C 参考资料

C 参考资料 C 关键词 C <stdio.h> C <stdlib.h> C <string.h> C <math.h> C <ctype.h> C <time.h>

C 标准库参考

C 标准库 - 参考手册 C 标准库 - <assert.h> C 标准库 - <ctype.h> C 标准库 - <errno.h> C 标准库 - <float.h> C 标准库 - <limits.h> C 标准库 - <locale.h> C 标准库 - <math.h> C 标准库 - <setjmp.h> C 标准库 - <signal.h> C 标准库 - <stdarg.h> C 标准库 - <stddef.h> C 标准库 - <stdio.h> C 标准库 - <stdlib.h> C 标准库 - <string.h> C 标准库 - <time.h>

C 实例

C 语言实例 C 经典100例 C 编译器 C 测验


C 联合体

C 联合体

联合体 union 与结构体 struct 类似,因为它可以存储不同数据类型的成员。

但是,它们之间也存在一些区别:

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

大多数情况下,你会使用struct(结构体)而不是联合体,因为结构体可以同时存储和访问多个值,这在日常程序中更为常见。

但是,当你只需要一次存储几种可能类型中的一种,并且想要节省内存时,联合体就非常有用。


声明联合体

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

示例

union myUnion {        // Union declaration
  int myNum;           // Member (int)
  char myLetter;       // Member (char)
  char myString[30];   // Member (char array)
}; 

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", u1.myNum); // 该值不再可靠。
  printf("myLetter: %c", u1.myLetter); // 打印"A"

  return 0;
}
亲自试一试 »

联合体的大小

联合体的大小始终与其最大成员的大小相同:

示例

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

int main() {
  union myUnion u1;
  printf("Size of union: %zu bytes", sizeof(u1));
  return 0;
}
亲自试一试 »

由于最大的成员是 36 字节,因此整个 union 联合也将是 36 字节。

如果它是一个结构体(struct),则大小为 40 字节:
myNum(4 字节)+ myString(36 字节)= 总计 40 字节


何时使用联合体

以下情况可以使用联合体:

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