C语言:自定义类型:联合体与枚举
文章目录前言1. 联合体1.1 联合体类型的声明1.2 联合体类型的特点1.3 联合体大小的计算1.4 用联合判断大小端2. 枚举2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使用前言在C语言中除了基本数据类型如int、char、float和数组程序员还可以通过结构体、联合体和枚举来自定义复杂的数据类型。这些自定义类型极大地增强了C语言描述现实世界数据的能力。本文将重点介绍联合体和枚举这两种自定义类型。联合体以其独特的内存共享机制在节省内存和灵活解释数据方面发挥着重要作用而枚举则为程序中的整型常量提供了更具可读性和安全性的表示方式。理解并掌握它们是迈向高级C语言编程的关键一步。1. 联合体联合体是C语言中一种特殊的数据类型它允许在同一块内存空间中存储不同类型的数据成员。与结构体为每个成员分配独立内存不同联合体的所有成员共享同一段内存。这意味着在任意时刻联合体中只有一个成员是有效的对其中一个成员的赋值会覆盖其他成员的值。1.1 联合体类型的声明声明一个联合体类型使用关键字union其语法与结构体struct非常相似union联合体标签{成员类型1成员名1;成员类型2成员名2;// ... 更多成员};union声明联合体类型的关键字。联合体标签联合体类型的名称遵循C语言标识符命名规则。成员列表用花括号{}包裹内部定义了联合体的各个成员每个成员都有自己的类型和名称。示例声明一个简单的联合体#includestdio.h// 联合类型的声明unionUn{charc;inti;};intmain(){// 联合变量的定义unionUn un{0};// 计算联合变量的大小printf(%d\n,sizeof(un));//输出4return0;}1.2 联合体类型的特点联合体最核心的特点在于其内存共享机制这带来了以下几个关键特性所有成员共享同一内存地址联合体的所有成员都从同一内存地址开始存储。这意味着通过不同的成员名访问的是同一块内存区域。同一时间只有一个成员有效由于内存共享当你给一个成员赋值后再访问其他成员将得到未定义的值可能是之前值的残留也可能是被覆盖后的新值。程序员需要自己记录当前哪个成员是“活跃”的。大小由最大成员决定联合体变量占用的内存大小等于其所有成员中所需空间最大的那个成员的大小。编译器会确保联合体的大小至少能容纳下最大的成员并可能进行内存对齐。1.3 联合体大小的计算计算联合体的大小需要遵循两个原则大小至少等于其最大成员的大小。大小必须是所有成员类型对齐要求的整数倍内存对齐原则。计算步骤找出所有成员中占用空间最大的成员的大小sizeof(最大成员)。找出所有成员中对齐要求最严格的成员的对齐值通常等于其大小。最终联合体的大小是最大成员大小向上取整到最严格对齐值的整数倍。unionExample{charc;// 大小1字节对齐要求1字节inti;// 大小4字节对齐要求4字节在常见32/64位系统上doubled;// 大小8字节对齐要求8字节};最大成员是double d大小为8字节。最严格的对齐要求也是double的8字节。因此union Example的大小为8字节。可以使用sizeof运算符验证printf(Size of union Example: %zu bytes\n,sizeof(unionExample));// 输出 8与结构体大小对比structSExample{charc;inti;doubled;};// 在考虑对齐如按8字节对齐后此结构体大小可能为 1(3填充)4(4填充)8 24字节。可以看到联合体通过共享内存在存储“互斥”数据时能比结构体节省大量空间。1.4 用联合判断大小端我们可以写一个程序判断当前机器是大端还是小端。int check_sys() { union { int i; char c; }un; un.i 1; return un.c;//返回1是小端返回0是大端 }2. 枚举枚举是C语言中一种用于定义一组命名整型常量的自定义数据类型。2.1 枚举类型的声明声明一个枚举类型使用关键字enum其基本语法如下enum枚举标签{枚举常量1,枚举常量2,// ... 更多常量};enum声明枚举类型的关键字。枚举标签枚举类型的名称遵循C语言标识符命名规则。枚举常量列表用花括号{}包裹内部列出所有枚举常量常量之间用逗号分隔。示例声明一个表示星期的枚举类型enumWeekday{MONDAY,// 默认值为 0TUESDAY,// 默认值为 1WEDNESDAY,// 默认值为 2THURSDAY,// 默认值为 3FRIDAY,// 默认值为 4SATURDAY,// 默认值为 5SUNDAY// 默认值为 6};枚举常量的值默认情况下第一个枚举常量的值为0后续常量依次递增1。可以显式地为枚举常量指定整数值未指定的常量将基于前一个值递增1。enum Color { RED 1, GREEN, // 值为 2 BLUE 5, YELLOW // 值为 6 };2.2 枚举类型的优点我们可以使用#define定义常量为什么非要使用枚举相比#define枚举具有以下显著优点增加代码的可读性和可维护性枚举常量使用有意义的名称使代码意图一目了然。同时枚举常量集中定义在一处便于统一管理和修改。和#define定义的标识符比较枚举有类型检查更加严谨便于调试预处理阶段会删除#define定义的符号使用方便一次可以定义多个常量枚举常量是遵循作用域规则的枚举声明在函数内只能在函数内使用。2.3 枚举类型的使用enumColor//颜色{RED1,GREEN2,BLUE4};enumColorclrGREEN;//使用枚举常量给枚举变量赋值在C语言中可以直接用整数给枚举变量赋值但是在C是不行的C的类型检查比较严格。

相关新闻

Windows 任务栏透明化完整指南:TranslucentTB 从安装到进阶玩法

Windows 任务栏透明化完整指南:TranslucentTB 从安装到进阶玩法

Windows 任务栏透明化完整指南:TranslucentTB 从安装到进阶玩法 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你留意过别人…

2026/10/8 4:40:53 阅读更多 →
永久修改Word/WPS默认背景色:从Normal.dotm模板到护眼实践

永久修改Word/WPS默认背景色:从Normal.dotm模板到护眼实践

1. 为什么需要永久更改Word/WPS的默认背景色? 每次打开Word或者WPS,面对那片刺眼的白色编辑区,你是不是也感到眼睛疲劳?尤其是在深夜赶稿或者长时间阅读文档时,白色的背景就像一盏小台灯,直射你的眼睛。很多…

2026/10/13 23:05:09 阅读更多 →
Legacy-iOS-Kit系统降级指南:旧iPhone与iPad卡顿自救,一次还原重获新生

Legacy-iOS-Kit系统降级指南:旧iPhone与iPad卡顿自救,一次还原重获新生

Legacy-iOS-Kit系统降级指南:旧iPhone与iPad卡顿自救,一次还原重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirr…

2026/10/7 12:08:03 阅读更多 →

最新新闻

DeepSeek-V3 学习手册:从零上手到工程化调用与评测

DeepSeek-V3 学习手册:从零上手到工程化调用与评测

简介:这份《DeepseekV3从零基础到精通学习手册》面向希望系统掌握DeepSeek V3平台的初学者与进阶用户,帮助读者从注册登录、API调用到实际案例应用逐步上手,解决大模型工具入门难、配置流程不清晰的问题。资源包内含1个PDF文件,整…

2026/10/15 9:33:29 阅读更多 →
计算机网络基础:从数据传输到协议封装与路由选择

计算机网络基础:从数据传输到协议封装与路由选择

1. 计算机网络基础认知:从水管系统理解数据传输当你在手机上刷短视频、用电脑收发邮件时,背后都是计算机网络在默默工作。但要说清楚这玩意儿到底是什么,咱们不妨用城市供水系统打个比方:想象一下,你家水龙头流出的自来…

2026/10/15 9:33:29 阅读更多 →
一胜九败:创业者如何把失败变成认知升级与经营护城河

一胜九败:创业者如何把失败变成认知升级与经营护城河

“一胜九败”——这四个字第一次看到时,我就知道这不是一本普通的成功学读物。市面上写创业的书太多了,大部分都在讲“九胜一败”或者“百战百胜”,恨不得把创始人包装成从未犯错的神。但这本书的书名直接把“一胜”放在前面,“九…

2026/10/15 9:33:29 阅读更多 →
VegaPrime中文教程:从场景搭建到视景仿真的落地路径

VegaPrime中文教程:从场景搭建到视景仿真的落地路径

简介:这份Vega Prime中文教程面向三维实时仿真与视景开发的初学者及进阶用户,帮助读者系统掌握Vega Prime这一3D实时应用开发平台的基础操作与核心流程。内容涵盖实时应用构建、Lynx Prime图形界面使用以及工具箱功能,并逐步讲解场景初始化、…

2026/10/15 9:33:28 阅读更多 →
基于Spark的社交媒体病毒式传播分析与预测系统

基于Spark的社交媒体病毒式传播分析与预测系统

1. 选题定位与核心价值拆解先说结论:把“Spark 病毒式社交媒体传播”做成毕业设计,是一个性价比非常高的选择。它既踩中了大数据技术栈的核心——Spark,又连着机器学习和深度学习这两个当下最热的方向,同时还自带一套通俗易懂、演…

2026/10/15 9:33:28 阅读更多 →
华为云ModelArts模型部署五层契约与实战避坑指南

华为云ModelArts模型部署五层契约与实战避坑指南

1. 这不是“云上点点鼠标”的故事,而是一次真实模型落地的全链路复盘我用ModelArts跑通第一个可对外提供API服务的OCR模型时,卡在模型转换环节整整三天——不是因为不会写代码,而是因为没搞懂华为云ModelArts里“推理镜像”和“自定义镜像”的…

2026/10/15 9:32:28 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →