news 2026/6/23 21:10:12

共用体类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
共用体类型

一、 共用体的基本概念

1. 什么是共用体
共用体(union)是一种特殊的数据类型,允许在同一内存位置存储不同的数据类型。
所有成员共享同一段内存空间,共用体的大小等于其最大成员的大小。
2. 与结构体的本质区别
结构体:各成员占用不同的内存空间,互相独立。
共用体:所有成员占用同一块内存空间,同一时间只能存储一个成员的值。
3. 主要用途
节省内存空间,特别是在多个数据不会同时使用的情况下。
用于处理不同类型的数据,例如实现多态性(但C语言本身不支持面向对象)。
常用于系统编程、硬件访问、数据包解析等场景。

二、 共用体类型的定义

1. 定义格式
union 共用体名

{
数据类型 成员1;
数据类型 成员2;

};

2. 定义示例
// 定义一个共用体,可以存储整数、浮点数或字符数组
union Data

{
int i;
float f;
char str[20];
};

三、 共用体变量的声明与初始化

1. 声明共用体变量的三种方式
先定义类型,再声明变量
union Data data1, data2;
定义类型的同时声明变量

union Data

{
int i;
float f;

} data1, data2;

使用无名共用体类型
union

{
int i;
float f;
} data1, data2;

2. 共用体变量的初始化
共用体只能初始化其第一个成员。
union Data data = {10}; // 初始化第一个成员
从C99标准开始,可以使用指定初始化器初始化任意成员。
union Data data = {.f = 3.14}; // 初始化成员

四、 共用体成员的访问

1. 使用点运算符.访问成员
union Data data;
data.i = 10; // 存储整数
printf("%d\n", data.i);

data.f = 3.14; // 存储浮点数,此时整数被覆盖
printf("%f\n", data.f);


2. 共用体指针与箭头运算符->
union Data *p = &data;
p->i = 20;
printf("%d\n", p->i);

五、 共用体的内存布局

1. 内存共享原理
所有成员从同一内存地址开始存放。
内存大小由最大的成员决定。
2. 示例分析
union Example

{
int a; // 4字节(假设)
char b; // 1字节
float c; // 4字节

};
此共用体的大小为4字节(假设int和float为4字节)。
成员a、b、c共享这4字节内存。
3. 使用sizeof获取共用体大小
printf("共用体大小:%zu\n", sizeof(union Example));

六、 共用体的应用实例

1. 存储不同类型的数据
union Value

{
int intValue;
double doubleValue;
char *stringValue;
};

struct Variant

{
int type; // 用于标识当前存储的数据类型
union Value value; // 存储的实际数据
};
2. 硬件寄存器访问
假设一个32位寄存器可以按位段或整型访问
union Register

{
unsigned int value;
struct

{
unsigned int bit0 : 1;
unsigned int bit1 : 1;
...
} bits;

};
3. 数据包解析
解析网络协议中的字段,可能以不同方式解释同一段数据
union Packet

{
unsigned char rawData[20];
struct

{
unsigned char header;
unsigned int address;
unsigned char data[15];
} fields;

};

七、 共用体与结构体的结合使用

1. 在结构体中嵌套共用体

struct Product

{
int id;
char name[50];
union

{
float weight;
int volume;
} measure;

};

2. 使用标记字段区分共用体中当前有效的成员
struct Number

{
enum {INT, FLOAT, CHAR} type; // 标记当前存储的类型
union

{
int i;
float f;
char c;
} value;
};

struct Number num;
num.type = INT;
num.value.i = 10;

八、 重要注意事项

1. 内存覆盖问题
共用体同一时间只能存储一个成员的值,给一个成员赋值会覆盖其他成员的值。
读取最近被赋值的成员才有意义。
2. 初始化限制
标准C只允许初始化共用体的第一个成员(C89),但现代编译器支持C99指定初始化器。
3. 字节序(大端/小端)问题
在共用体中,不同数据类型的存储方式受字节序影响,这在跨平台编程时需要注意。
4. 类型安全
共用体缺乏类型安全检查,需要程序员自己保证正确地访问当前有效的成员。
5. 结构体与共用体的嵌套
结构体和共用体可以互相嵌套,形成复杂的数据结构。

九、重点总结

1. 共用体定义:掌握共用体类型的定义方法。
2. 变量声明与初始化:了解共用体变量的声明和初始化方式。
3. 成员访问:熟练使用.和->运算符访问共用体成员。
4. 内存理解:理解共用体共享内存的特性,知道其大小由最大成员决定。
5. 应用场景:了解共用体的典型应用,如节省内存、处理多种类型数据等。
6. 注意事项:注意共用体的覆盖问题、初始化限制和类型安全问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 23:19:52

第30章 Shell 正则表达式实战:精准匹配字符串、日志与配置项

本章导语:正则表达式是文本处理的"瑞士军刀",是 Linux 系统管理和数据处理的核心技能。掌握正则表达式,你将能够精准匹配和处理各种复杂的文本模式,从日志分析到配置文件管理,从数据清洗到格式验证,无所不能。本章将通过丰富的实战案例,帮助你彻底掌握正则表达…

作者头像 李华
网站建设 2026/6/23 20:24:23

音视频学习(七十二):视频压缩:分块与预处理

分块与预处理是视频压缩(编码)流程的起点,它的目标是将原始的、高冗余的视频数据转换成适合高效压缩的格式和基本处理单元。这一阶段的工作质量直接影响后续运动估计、变换编码和量化等步骤的效率和最终的压缩比与图像质量。 预处理的核心目标…

作者头像 李华
网站建设 2026/6/23 20:42:14

AMD Ryzen性能调优:快速掌握处理器调试工具的使用技巧

AMD Ryzen性能调优:快速掌握处理器调试工具的使用技巧 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

作者头像 李华
网站建设 2026/6/23 21:03:46

深蓝词库转换:轻松打通全平台输入法数据壁垒

深蓝词库转换:轻松打通全平台输入法数据壁垒 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 想要实现搜狗、百度、QQ、微软等主流输入法之间的词库自由迁…

作者头像 李华
网站建设 2026/6/23 18:59:49

(新卷,200分)- 最小传输时延Ⅱ(Java JS Python)

(新卷,200分)- 最小传输时延Ⅱ(Java & JS & Python)题目描述有M*N的节点矩阵,每个节点可以向8个方向(上、下、左、右及四个斜线方向)转发数据包,每个节点转发时会消耗固定时延,连续两个…

作者头像 李华
网站建设 2026/6/23 19:33:30

OpenHarmony AI人脸识别与手势控制系统开发指南

概述 基于OpenHarmony现有AI框架(AI Engine、Neural Network Runtime、Intelligent Voice Framework)构建一个人脸识别与手势控制系统。系统通过识别人的表情和手势来执行对应的底层按键命令,如向左/向右滑动、点击、返回等操作。 系统架构 核心组件 AI Engine - 提供插件…

作者头像 李华