西宁网站建设加盟代理海口网站排名提升

张小明 2026/1/1 8:36:04
西宁网站建设加盟代理,海口网站排名提升,问答主题WordPress,河北省建设机械会网站首页引入在学习了结构体之后#xff0c;我们知道它能将不同类型的数据组合成一个整体#xff0c;每个成员都有独立的内存空间。但在实际开发中#xff0c;有时我们只需要同一内存空间存储不同类型的数据#xff0c;或者需要定义一组有名字的常量#xff0c;这时候就需要用到C语…引入在学习了结构体之后我们知道它能将不同类型的数据组合成一个整体每个成员都有独立的内存空间。但在实际开发中有时我们只需要同一内存空间存储不同类型的数据或者需要定义一组有名字的常量这时候就需要用到C语言中的联合体和枚举了。联合体是一种“共享内存”的自定义类型能极大节省内存空间枚举则是用于定义常量集合的类型让代码更易读、易维护。这篇文章会从基础声明开始用生活例子和代码实例拆解核心知识点帮新手轻松掌握这两种类型的用法。1. 联合体类型的声明与基本使用1.1 联合体的概念联合体也叫共用体是一种特殊的自定义复合数据类型它的所有成员共享同一块内存空间。简单来说联合体的内存空间大小至少能容纳最大的成员所有成员都从同一个内存地址开始存储。1.2 联合体类型的声明联合体的声明语法和结构体非常相似只是关键字从struct换成了union。基本格式union 联合体名 { 成员类型1 成员名1; 成员类型2 成员名2; // ... 更多成员 }; // 注意分号不能省略实例声明一个用于存储不同数据类型的联合体// 声明名为Data的联合体类型 union Data { char c; // 字符型1字节 int i; // 整型4字节 float f; // 浮点型4字节 };核心理解union Data是一个新的自定义类型和int、struct一样用于定义变量其成员共享同一块内存。1.3 联合体变量的创建和初始化联合体变量的创建方式和结构体类似支持声明后创建、声明时创建也支持初始化但只能初始化一个成员。实例#include stdio.h union Data { char c; int i; float f; }; int main() { // 方式1声明后创建变量 union Data d1; // 方式2声明时创建变量可省略单独声明步骤 // union Data d2; // 初始化只能初始化第一个成员或用指定成员初始化C99 union Data d3 {a}; // 初始化字符成员c union Data d4 {.i 100}; // C99标准指定初始化整型成员i union Data d5 {.f 3.14f}; // 指定初始化浮点型成员f return 0; }2. 联合体的核心特点联合体的所有特性都源于成员共享内存这一核心这也是它和结构体最本质的区别。2.1 特点1所有成员共享同一块内存空间联合体的每个成员都从同一个内存地址开始存储修改一个成员会覆盖其他成员的值。实例验证#include stdio.h union Data { char c; int i; float f; }; int main() { union Data d; // 打印联合体变量的地址以及各成员的地址 printf(联合体变量d的地址%p\n, d); printf(成员c的地址%p\n, d.c); printf(成员i的地址%p\n, d.i); printf(成员f的地址%p\n, d.f); // 修改成员i的值观察成员c的变化 d.i 0x12345678; printf(修改i后c的值%#x\n, d.c); // 输出结果与机器大小端有关 return 0; }输出结果以小端机器为例联合体变量d的地址0061FEAC 成员c的地址0061FEAC 成员i的地址0061FEAC 成员f的地址0061FEAC 修改i后c的值0x78结论所有成员的地址和联合体变量的地址完全相同证明它们共享同一块内存。2.2 特点2同一时间只能有效使用一个成员由于成员共享内存当我们给一个成员赋值后其他成员的值会被覆盖因此同一时间只有一个成员的值是有效的。实例验证#include stdio.h union Data { char c; int i; float f; }; int main() { union Data d; d.c a; printf(d.c %c\n, d.c); // 输出a // 此时i和f的值是随机的被c覆盖后的垃圾值 printf(d.i %d\n, d.i); // 输出随机值 d.i 100; printf(d.i %d\n, d.i); // 输出100 // 此时c的值被i覆盖f的值仍为垃圾值 printf(d.c %c\n, d.c); // 输出dASCII码100对应字符d d.f 3.14f; printf(d.f %.2f\n, d.f); // 输出3.14 // 此时c和i的值被f覆盖 printf(d.i %d\n, d.i); // 输出随机值 return 0; }新手提醒使用联合体时要明确当前正在使用的成员避免读取被覆盖的无效值。2.3 相同成员的结构体和联合体对比为了更直观理解联合体的“共享内存”特性我们对比相同成员的结构体和联合体的内存占用与布局。2.3.1 内存占用对比#include stdio.h // 结构体成员有独立内存 struct Stu { char c; int i; float f; }; // 联合体成员共享内存 union Data { char c; int i; float f; }; int main() { printf(结构体Stu的大小%zu字节\n, sizeof(struct Stu)); // 输出12内存对齐后 printf(联合体Data的大小%zu字节\n, sizeof(union Data)); // 输出4最大成员的大小 return 0; }2.3.2 内存布局对比类型内存布局特点内存大小VS环境结构体每个成员有独立的内存空间按对齐规则排列12字节char占1字节补3字节对齐int4字节float4字节联合体所有成员共享同一块内存从同一地址开始4字节最大成员int/float的大小生活比喻结构体像一套带多个房间的房子每个成员住一个房间各自独立联合体像一套只有一个房间的房子所有成员轮流住这个房间一次只能住一个。3. 联合体大小的计算联合体的大小计算比结构体简单核心是“容纳最大成员内存对齐”。3.1 联合体大小的计算规则基础规则联合体的大小至少是最大成员的大小要能容纳最大的成员。对齐规则联合体的大小必须是联合体中最大对齐数的整数倍对齐数的定义和结构体一致成员自身大小与编译器默认对齐数的较小值。关键概念联合体的最大对齐数是其所有成员的对齐数中的最大值。3.2 实例解析联合体大小计算实例1简单联合体#include stdio.h union Data1 { char c; // 大小1字节对齐数1VS默认对齐数81和8取1 int i; // 大小4字节对齐数44和8取4 float f; // 大小4字节对齐数44和8取4 }; int main() { // 最大成员大小是4字节最大对齐数是44是4的整数倍因此大小为4 printf(sizeof(union Data1) %zu\n, sizeof(union Data1)); // 输出4 return 0; }实例2包含不同对齐数的联合体#include stdio.h union Data2 { char c[5]; // 大小5字节对齐数1数组的对齐数为元素的对齐数 int i; // 大小4字节对齐数4 }; int main() { // 步骤1最大成员大小是5字节char[5] // 步骤2最大对齐数是4int的对齐数 // 步骤35不是4的整数倍向上取整到8最近的4的整数倍 printf(sizeof(union Data2) %zu\n, sizeof(union Data2)); // 输出8 return 0; }3.3 联合体的经典练习判断机器的大小端存储大小端是计算机存储数据的两种方式这是C语言面试的高频考点用联合体可以轻松实现判断。3.3.1 先理解大小端的概念大端存储数据的高位字节存放在内存的低地址处低位字节存放在高地址处。小端存储数据的低位字节存放在内存的低地址处高位字节存放在高地址处。举例存储整数0x123456784字节存储方式低地址 → 高地址的字节排列大端0x12 → 0x34 → 0x56 → 0x78小端0x78 → 0x56 → 0x34 → 0x123.3.2 用联合体实现大小端判断思路定义一个联合体包含一个int成员和一个char成员。给int成员赋值1二进制00000000 00000000 00000000 00000001。读取char成员的值若为1则是小端若为0则是大端。代码实现#include stdio.h // 定义联合体 union CheckEndian { int i; char c; }; int main() { union CheckEndian ce; ce.i 1; if (ce.c 1) { printf(当前机器是小端存储\n); } else { printf(当前机器是大端存储\n); } return 0; }输出结果当前机器是小端存储原理int类型的1在小端机器中低位字节0x01存放在低地址char成员的地址因此ce.c的值为1大端机器中高位字节0x00存放在低地址因此ce.c的值为0。4. 枚举类型的声明与基本使用4.1 枚举的概念枚举Enumeration是一种用于定义命名常量集合的自定义类型它把一组相关的常量用有意义的名字表示让代码更易读、易维护。4.2 枚举类型的声明枚举的声明关键字是enum语法格式如下基本格式enum 枚举名 { 枚举常量1, 枚举常量2, // ... 更多枚举常量 };实例声明一个表示星期的枚举类型// 声明名为Week的枚举类型 enum Week { Mon, // 周一默认0 Tue, // 周二默认1 Wed, // 周三默认2 Thu, // 周四默认3 Fri, // 周五默认4 Sat, // 周六默认5 Sun // 周日默认6 };核心理解枚举中的每个常量如Mon、Tue都是整数常量默认从0开始依次递增Mon0Tue1…Sun6。可以手动指定枚举常量的值未指定的会在前一个常量的基础上1。实例1手动指定起始值// 手动指定起始值后续依次递增 enum Week { Mon 1, Tue, // 2 Wed, // 3 Thu, // 4 Fri, // 5 Sat, // 6 Sun // 7 };实例2随机指定枚举常量的值// 随机指定枚举常量的值 enum Color { Red 3, Green 7, Blue // 8前一个是7故为8 };4.3 枚举变量的创建和初始化枚举变量的创建方式和结构体、联合体类似支持声明后创建、声明时创建。实例#include stdio.h enum Week { Mon 1, Tue, Wed, Thu, Fri, Sat, Sun }; int main() { // 方式1声明后创建变量 enum Week today; today Wed; // 给枚举变量赋值只能赋枚举常量 printf(今天是星期%d\n, today); // 输出今天是星期3 // 方式2声明时创建变量 enum Color { Red, Green, Blue } color Green; printf(颜色对应的常量值%d\n, color); // 输出1 return 0; }新手提醒枚举变量本质是整数也可以赋值为整数但不推荐失去枚举的意义。5. 枚举类型的优点在C语言中我们可以用#define定义常量那为什么还要用枚举呢枚举有以下几个显著优点5.1 优点1代码更易读、易理解枚举常量有明确的名字比#define的无意义数字更直观。对比// 用#define定义常量可读性差 #define MON 1 #define TUE 2 #define WED 3 // 用枚举定义可读性强 enum Week { Mon 1, Tue, Wed };5.2 优点2有类型检查更安全枚举是一种自定义类型编译器会对枚举变量进行一定的类型检查而#define只是简单的文本替换没有类型检查。5.3 优点3便于调试和维护枚举常量是编译器处理的调试时能直接看到常量的名字而#define的常量在预处理阶段被替换成数字调试时只能看到数字。同时枚举把相关常量集中定义修改时只需调整枚举声明无需到处修改#define的宏定义。6. 枚举类型的使用场景与实战示例6.1 场景1表示状态或选项比如用枚举表示程序的运行状态、用户的操作选项等。实例表示游戏角色的状态#include stdio.h // 定义游戏角色状态的枚举 enum RoleState { Idle, // 空闲 Move, // 移动 Attack, // 攻击 Defend, // 防御 Die // 死亡 }; // 函数打印角色状态 void printState(enum RoleState state) { switch (state) { case Idle: printf(角色处于空闲状态\n); break; case Move: printf(角色正在移动\n); break; case Attack: printf(角色正在攻击\n); break; case Defend: printf(角色正在防御\n); break; case Die: printf(角色已死亡\n); break; default: printf(无效状态\n); } } int main() { enum RoleState rs Attack; printState(rs); // 输出角色正在攻击 return 0; }6.2 场景2简化switch语句的case判断枚举常量作为switch的case条件能让代码结构更清晰。实例处理用户输入的菜单选项#include stdio.h // 定义菜单选项的枚举 enum MenuOption { Add 1, Delete, Modify, Query, Exit }; int main() { int choice; printf(请选择操作\n); printf(1. 添加\n2. 删除\n3. 修改\n4. 查询\n5. 退出\n); scanf(%d, choice); switch (choice) { case Add: printf(执行添加操作\n); break; case Delete: printf(执行删除操作\n); break; case Modify: printf(执行修改操作\n); break; case Query: printf(执行查询操作\n); break; case Exit: printf(退出程序\n); break; default: printf(无效选项\n); } return 0; }7. 通用补充内容新手必看7.1 结构体与联合体的核心关联对比强化理解结构体和联合体都是C语言的自定义复合类型核心区别在于内存使用方式具体关联对比如下对比维度结构体struct联合体union内存分配每个成员独立分配内存总大小≥成员大小之和受对齐影响所有成员共享一块内存总大小为最大成员大小受对齐影响成员使用多个成员可同时有效修改一个不影响其他同一时间只能有一个成员有效修改一个覆盖其他使用场景描述一个对象的多个属性如学生的姓名、年龄、成绩同一内存存储不同类型数据如传感器数据、大小端判断核心优势数据独立性强能完整描述复杂对象节省内存空间适合资源有限场景总结结构体是“组合”数据联合体是“复用”内存根据是否需要同时使用多个成员来选择。7.2 新手常见错误避坑指南拓展版错误类型表现形式解决方法初始化联合体多个成员union Data d {a, 100};联合体只能初始化一个成员优先用指定成员初始化.i 100认为联合体成员可同时使用给一个成员赋值后同时读取多个成员的值明确当前有效成员只读取正在使用的成员避免读取被覆盖的无效值枚举常量赋值修改enum Week {Mon}; Mon 1;枚举常量是只读整数常量不能修改需修改则在声明时指定枚举变量随意赋值整数enum Week w 10;无对应枚举常量尽量只赋枚举中定义的常量避免失去枚举的类型优势和可读性忽略联合体内存对齐认为联合体大小就是最大成员的大小记住联合体大小需满足“最大对齐数的整数倍”计算时先找最大对齐数结构体/联合体声明漏写分号struct Stu { char name[20]; int age; }养成习惯在结构体/联合体声明的大括号后加;混淆联合体与结构体的成员访问联合体指针用.访问成员p.name统一规则普通变量用.指针变量用-结构体和联合体通用结束语到这里我们就把C语言联合体和枚举的核心知识点全部梳理完毕了。联合体的核心是共享内存通过复用内存空间实现高效存储判断机器大小端是其经典应用枚举的核心是命名常量让代码从“满屏数字”变得直观易懂提升可读性和可维护性。结构体、联合体、枚举这三种自定义类型共同构成了C语言描述复杂数据和逻辑的基础。掌握它们的核心区别和使用场景你就能写出更灵活、更高效的C语言程序。希望这份指南能帮你彻底搞懂联合体和枚举也愿你在C语言的学习之路上不断积累持续进步
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站开发制作合同范本wordpress手机字体变大6

毫秒级语音定位:faster-whisper词级时间戳实战手册 【免费下载链接】faster-whisper plotly/plotly.js: 是一个用于创建交互式图形和数据可视化的 JavaScript 库。适合在需要创建交互式图形和数据可视化的网页中使用。特点是提供了一种简单、易用的 API,…

张小明 2026/1/1 3:10:15 网站建设

揭阳做网站网站突然没有收录

在地图上加载楼栋,发现楼栋的数据有很多是杂质数据;不难看到地图上展示出来很多细细的棍子,根本就不像楼宇,所以我这里分享如何利用OQIS快速筛掉这些数据,导致数据加载出来能够好看一些。打开QGIS工具,加载…

张小明 2026/1/1 3:10:16 网站建设

酒店网站建设的基本内容ipv6跟做网站有关吗

导语 【免费下载链接】GLM-4-9B-0414 项目地址: https://ai.gitcode.com/zai-org/GLM-4-9B-0414 GLM系列再添重磅成员——GLM-4-9B-0414,这款仅90亿参数的开源小模型凭借深度优化的训练技术,在数学推理、通用任务处理等核心能力上达到同级别模型…

张小明 2026/1/1 3:10:14 网站建设

高端网站设计官网网络营销推广的方式包括

课题摘要在校园餐饮场景下,学生存在 “美食选择盲目、口味匹配度低、食堂 / 周边商铺信息分散” 的痛点,基于 k-means 算法的校园美食推荐系统,能通过用户画像聚类实现精准推荐,提升学生就餐体验与校园餐饮运营效率。从数据维度层…

张小明 2026/1/1 3:10:19 网站建设

服装设计网站模板下载wordpress 模板代码

VRCT终极指南:5分钟掌握跨语言VR交流工具 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT 在虚拟现实社交平台VRChat的全球化社区中,语言障碍常常成为交流的瓶颈。…

张小明 2025/12/31 20:24:26 网站建设