C 语言联合体详解:多类型数据共享内存的高效管理
联合体 是 C 语言特殊数据类型,允许在同一内存位置存储不同数据类型。可定义多成员联合体,但任一时刻只能有一个成员包含值。联合体提供同一内存位置多用途的高效方式。
定义联合体
定义联合体须使用 union 语句,方式同定义结构体。union 语句为程序定义包含多成员的新数据类型。union 语句格式:
union [union tag] { member definition; member definition; ... member definition; } [one or more union variables];
联合体标记 可选,每个成员定义为普通变量定义,如 int i; 或 float f; 等。联合体定义结束、最后分号前,可指定一个或多个联合体变量(可选)。定义包含 i、f、str 三成员的联合体类型 Data:
union Data { int i; float f; char str[20]; } data;
现在 Data 类型变量可存整数、浮点数或字符串。即单个变量(同一内存位置)可存多种类型数据。联合体内可用任何内置或用户定义数据类型。
联合体占用内存足以容纳最大成员。上例中 Data 类型占 20 字节,因字符串最多占 20 字节。下例显示联合体占用内存总大小:
Live Demo
#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; printf( "Memory size occupied by data : %d\n", sizeof(data)); return 0; }
编译执行输出:
Memory size occupied by data : 20
访问联合体成员
访问联合体任意成员使用成员访问运算符 (.)。成员访问运算符为联合体变量名与成员名之间的句点。使用关键字 union 定义联合体类型变量。下例展示程序中使用联合体:
Live Demo
#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; data.i = 10; data.f = 220.5; strcpy( data.str, "C Programming"); printf( "data.i : %d\n", data.i); printf( "data.f : %f\n", data.f); printf( "data.str : %s\n", data.str); return 0; }
编译执行输出:
data.i : 1917853763 data.f : 4122360580327794860452759994368.000000 data.str : C Programming
可见 i 和 f 成员值损坏,因最后赋值的 str 占据了内存位置,故 str 成员打印正常。
再看同例但一次只用一个成员,这是联合体主要目的:
Live Demo
#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; data.i = 10; printf( "data.i : %d\n", data.i); data.f = 220.5; printf( "data.f : %f\n", data.f); strcpy( data.str, "C Programming"); printf( "data.str : %s\n", data.str); return 0; }
编译执行输出:
data.i : 10 data.f : 220.500000 data.str : C Programming
现在所有成员打印正常,因一次仅使用一个成员。
C语言
- 微处理器:存储程序计算的演进
- 综合 Op-Amp 数据:National Semiconductor 与 CA3130 数据手册
- 深入理解 C++ 数据类型:基础类型、修饰符与最佳实践
- C 语言数据类型详解:int、float、char 等核心类型完全指南
- C语言联合体详解:定义、用法与结构体对比
- C 语言数据类型完全指南:整型、浮点型、void 与派生类型
- C++数据结构实战:结构体struct定义、访问、函数参数、指针与typedef别名
- C++数据抽象实战:接口与实现分离的设计艺术
- C++数据封装:守护代码安全的核心机制
- C# 数据类型权威指南:值类型、引用类型、指针类型与 sizeof 实战
- MATLAB 数据类型完全指南:15 种基本类型、转换函数与类型判断函数速查表
- 精通Python数据类型:实战指南