当前位置: 首页 > news >正文

联合体(Union)

联合体(Union)简介

联合体(union)是 C 和 C++ 编程语言中的一种数据结构,和结构体(struct)类似,但有一些重要的区别。

定义
  • 联合体中的所有成员共享同一段内存,也就是说,联合体中的多个成员变量会占用相同的地址,但是在任何一个时间点只能存储一个成员的值。

1. 联合体的定义和语法

定义语法
union UnionName {DataType member1;DataType member2;...
};
示例
union Example {int i;       // 整数,占用 4 字节float f;     // 浮点数,占用 4 字节char c;      // 字符,占用 1 字节
};
  • 这里的联合体 Example 包含了 3 个成员:
    • 一个整数 i,占用 4 字节。
    • 一个浮点数 f,占用 4 字节。
    • 一个字符 c,占用 1 字节。
  • 存储特点
    • 联合体的总大小取决于它的最大成员所需的内存大小(这里是 4 字节,因为 intfloat 都占 4 字节)。

2. 联合体的内存分配

内存共享特点
  • 联合体中的所有成员都共享同一块内存,因此:
    • 写入一个成员会覆盖其他成员的值。
    • 在任意时刻,联合体中只能存储一个有效值。
示例
union Example {int i;       // 整数,占用 4 字节float f;     // 浮点数,占用 4 字节char c[4];   // 字符数组,占用 4 字节
};
union Example ex;
ex.i = 42;      // 写入整数 42
printf("i: %d\n", ex.i);    // 输出 i 的值:42
ex.f = 3.14;    // 写入浮点数 3.14
printf("f: %.2f\n", ex.f);  // 输出 f 的值:3.14
printf("i: %d\n", ex.i);    // 输出 i 的值:此时 i 的值已被覆盖
输出
i: 42
f: 3.14
i: 1078523331   // i 的值被 f 的写入覆盖,解释为浮点数的二进制形式

3. 联合体的用途

3.1 内存节省
  • 联合体非常适合需要节省内存的场景。
  • 由于多个成员共享同一段内存,可以显著减少内存占用。
3.2 数据转换
  • 联合体常用于类型转换,允许以不同的方式访问同一块数据。
示例:浮点数与二进制表示的转换
#include <stdio.h>
union FloatToBits {float f;unsigned int bits;
};
int main() {union FloatToBits data;data.f = 3.14;   // 写入浮点数printf("Float: %.2f\n", data.f);          // 输出浮点数printf("Bits: 0x%X\n", data.bits);        // 输出二进制表示return 0;
}
输出
Float: 3.14
Bits: 0x4048F5C3
  • 同一块内存可以通过 data.f 访问为浮点数,通过 data.bits 访问为其二进制位。

4. 联合体的常见用途

4.1 数据协议处理
  • 联合体常用于解析二进制数据流。例如,在通讯协议中,可以通过联合体将字节流解析为特定的数据结构。
示例:解析 16 位数据的高低字节
union Data16 {unsigned short full;  // 16 位数据struct {unsigned char low;  // 低字节unsigned char high; // 高字节} parts;
};
int main() {union Data16 data;data.full = 0x1234; // 写入 16 位数据printf("Full: 0x%X\n", data.full);      // 输出完整值printf("High: 0x%X\n", data.parts.high); // 输出高字节printf("Low: 0x%X\n", data.parts.low);   // 输出低字节return 0;
}
输出
Full: 0x1234
High: 0x12
Low: 0x34
应用场景
  • 网络协议
    • 在网络通讯中,经常需要解析协议头部,例如 IP 包头、TCP 包头等,联合体可以方便地拆解字段。
  • 嵌入式开发
    • 在嵌入式系统中,用联合体将字节序列解析为多字节变量(如 intfloat)。

4.2 硬件寄存器操作
  • 联合体可以用于操作硬件寄存器,通过联合体直接访问寄存器的特定位。
示例:32 位寄存器的分段访问
union Register {unsigned int value;  // 寄存器的完整值struct {unsigned char byte0;  // 第 0 字节unsigned char byte1;  // 第 1 字节unsigned char byte2;  // 第 2 字节unsigned char byte3;  // 第 3 字节} bytes;
};
int main() {union Register reg;reg.value = 0x12345678; // 写入寄存器值printf("Byte 0: 0x%X\n", reg.bytes.byte0); // 输出低字节printf("Byte 1: 0x%X\n", reg.bytes.byte1); // 输出次低字节printf("Byte 2: 0x%X\n", reg.bytes.byte2); // 输出次高字节printf("Byte 3: 0x%X\n", reg.bytes.byte3); // 输出高字节return 0;
}
输出
Byte 0: 0x78
Byte 1: 0x56
Byte 2: 0x34
Byte 3: 0x12

5. 联合体与结构体的区别

特性联合体(union)结构体(struct)
内存分配所有成员共享同一段内存,大小由最大成员决定每个成员都有独立的内存,大小是所有成员内存之和
成员访问同一时刻只能存储一个成员,访问其他成员可能导致数据不一致所有成员可以同时访问,互不干扰
用途内存节省,数据转换,多种数据形式的联合表示表示多种属性的组合体
使用限制不适合需要同时使用多个成员的场景可以同时访问多个成员

6. 注意事项

  1. 数据覆盖
    • 由于所有成员共享内存,当你写入一个成员时,会覆盖其他成员的值。
    • 使用联合体时要非常小心,确保对成员的访问逻辑正确。
  2. 对齐与大小
    • 联合体的大小由其最大成员的大小决定,并可能受到编译器对齐(padding)的影响。
  3. 联合体与类型安全
    • 联合体没有类型检查机制,读写不同类型的成员时可能导致不安全行为。

7. 总结

  • 联合体是 C/C++ 中的一种高级数据类型,适用于节省内存、数据解析和类型转换等场景。
  • 其核心特点是成员共享同一段内存,这既带来了灵活性,也对程序员提出了更高的使用要求。
  • 常见用途包括:
    1. 数据协议解析(如解析高低字节)。
    2. 硬件寄存器操作
    3. 浮点数与二进制位的转换
    4. 节省内存空间的场景

如有侵权,联系删除

相关文章:

联合体(Union)

联合体&#xff08;Union&#xff09;简介 联合体&#xff08;union&#xff09;是 C 和 C 编程语言中的一种数据结构&#xff0c;和结构体&#xff08;struct&#xff09;类似&#xff0c;但有一些重要的区别。 定义 联合体中的所有成员共享同一段内存&#xff0c;也就是说…...

Kibana:ES|QL 编辑器简介

作者&#xff1a;来自 Elastic drewdaemon ES|QL 很重要 &#x1f4aa; 正如你可能已经听说的那样&#xff0c;ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了&#xff0c;但随着时间的推移&#xff0c;它将成为与 Elasticsearch 中的数据交互的最强大…...

【工具】curl工具

curl 官网&#xff1a; https://curl.se/ github: https://github.com/curl?languagec curl 命令 所有参数介绍在线文档 简单使用教程 邮件发送命令 注&#xff1a; 支持SMTP&#xff08;或者POP3&#xff09;协议&#xff0c;curl的版本必须高于7.20&#xff08;含&…...

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具&#xff08;如 IDEA&#xff09;和远程服务之间的调试连接。当你启动远程调试时&#xff0c;IDEA 会监听这个配置的端口号&#xf…...

JavaWeb 前端基础 html + CSS 快速入门 | 018

今日推荐语 指望别人的救赎&#xff0c;势必走向毁灭——波伏娃 日期 学习内容 打卡编号2025年01月17日JavaWeb 前端基础 html CSS018 前言 哈喽&#xff0c;我是菜鸟阿康。 今天 正式进入JavaWeb 的学习&#xff0c;简单学习 html CSS 这2各前端基础部分&am…...

Debian 设定 tomcat 定时重启

目录 背景 过程记录 1、编辑sh文件&#xff0c;完成重启功能 2、设置sh的可执行权限 ​编辑 3、设置定时任务 背景 在Debian 12系统中&#xff0c;原本部署了两个tomcat&#xff0c;结果总是遇到CPU飙升到影响应用正常使用的程度&#xff0c;找了很久原因还是没有找到。 …...

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…...

下载文件,浏览器阻止不安全下载

背景&#xff1a; 在项目开发中&#xff0c;遇到需要下载文件的情况&#xff0c;文件类型可能是图片、excell表、pdf、zip等文件类型&#xff0c;但浏览器会阻止不安全的下载链接。 效果展示&#xff1a; 下载文件的两种方式&#xff1a; 一、根据接口的相对url&#xff0c;拼…...

基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)

个人名片 &#x1f525; 源码获取 | 毕设定制| 商务合作&#xff1a;《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台…...

【17】Word:林楚楠-供应链❗

目录 题目 NO1.2 NO3 NO4 NO5 NO6 NO7 NO89 题目 NO1.2 另存为&#xff1a;文件→另存为→文档→文件名/考生文件夹F12/FnF12→文件名/考生文件夹 插入→分节符→文本框→输入文件→排版_居中对齐→间距/回车去掉文本框的边框→选中文本框→格式&#xff1a;形状轮廓…...

Transformer中基于惊喜的遗忘机制

在语言建模任务上,拥有 760M 参数的 Titans(MAC) 在 WikiText 上达到了 19.93 的困惑度,显著优于同等规模的 Transformer++(25.21) 和 Mamba2(22.94)。在常识推理任务上,Titans 在包括 PIQA、HellaSwag、WinoGrande 等 9 个基准测试中的平均准确率达到 52.51%,超过了现…...

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中&#xff0c;51 单片机就像一颗独特的星辰&#xff0c;散发着神秘而迷人的光芒。对于无数电子爱好者而言&#xff0c;点亮 51 单片机上的第一颗 LED 灯&#xff0c;不仅仅是一次简单的操作&#xff0c;更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 在这个日益注重健康与体能的时代&#xff0c;健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息&#xff0c;包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…...

CF 641A.Little Artem and Grasshopper(Java实现)

题目分析 蚂蚱会在n个房间中根据既定房间规则向固定方向跳跃固定长度&#xff0c;试问是否能够跳出这个长度&#xff08;即落点位置在0或n1&#xff09; 思路分析 输入n就有n个房间&#xff0c;n套规则&#xff08;固定方向和跳跃距离&#xff09;&#xff0c;蚂蚱到哪个房间就…...

5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署

想象一下&#xff0c;只需简单几步操作&#xff0c;就能生成逼真的语音效果&#xff0c;无论是为客户服务还是为游戏角色配音&#xff0c;都能轻松实现。GPT-Sovits 模型&#xff0c;其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…...

1.Spring AI 从入门到实践

​Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…...

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…...

攻防世界 unseping

开启场景 整体来说是创建了一个case类&#xff0c;然后可接受post传来的ctf的值&#xff0c;并对其进行base64解码以及反序列化。所以我们能控制ctf变量。 先看__wakeup方法&#xff0c;该方法使用waf方法对$arg中的内容进行了防护&#xff0c;过滤掉了| & ; 空格 / cat f…...

Python编程与在线医疗平台数据挖掘与数据应用交互性研究

一、引言 1.1 研究背景与意义 在互联网技术飞速发展的当下,在线医疗平台如雨后春笋般涌现,为人们的就医方式带来了重大变革。这些平台打破了传统医疗服务在时间和空间上的限制,使患者能够更加便捷地获取医疗资源。据相关报告显示,中国基于互联网的医疗保健行业已进入新的…...

浔川 AI 翻译已修复,可正常使用

浔川 AI 翻译已修复&#xff0c;可正常使用 亲爱的用户们&#xff1a; 大家好&#xff01;经过技术团队的不懈努力&#xff0c;浔川 AI 翻译平台已完成修复&#xff0c;目前各项功能均已恢复正常&#xff0c;可流畅使用。在此&#xff0c;我们向一直以来关心和支持浔川 AI 翻译…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...