发布时间:2026/8/15 12:49:53
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的类型检查比较严格。

相关新闻

2026/8/15 12:49:53

梯度下降与反向传播:从原理到实战的深度学习优化核心

1. 项目概述:从“黑盒”到“白盒”的认知跃迁 在机器学习的入门路上,梯度下降和反向传播是两个绕不开的核心概念。很多初学者第一次接触时,会觉得它们像是一对“黑盒魔法”:把数据丢进去,模型就能自己学习,…

2026/8/15 12:44:53

解串器原理与应用:从时钟数据恢复到高速接口设计

1. 从“串”到“解”:为什么我们需要解串器? 在数字电路和高速通信的世界里,数据就像一条奔流不息的信息河流。当这条河流的流量越来越大,河道(也就是物理传输通道)的宽度和成本就成了瓶颈。想象一下&#…

2026/8/15 12:44:53

Linux系统下载官网指南:安全获取官方镜像与制作启动盘

1. 为什么“Linux系统下载官网”是个值得深究的话题? 刚接触Linux的朋友,或者想换个发行版尝尝鲜的老鸟,第一反应可能就是去搜“Linux系统下载官网”。这听起来是个再简单不过的操作,但实际操作起来,你会发现这里面的门…

2026/8/15 14:45:00

Python 数值代码卡顿:先用 profiler 区分解释器、内存和向量化

Python 数值代码卡顿:先用 profiler 区分解释器、内存和向量化 Python 数值代码变慢时,先确认时间花在解释器循环、数组分配、数据拷贝还是底层算子。只看总耗时很容易把优化做错位置。 1. 先用 profiler 切开时间 科学计算的性能结论离不开输入规模、数…

2026/8/15 14:45:00

Transformer Demo 准不代表可用:检查掩码、长度与注意力开销

Transformer Demo 准不代表可用:检查掩码、长度与注意力开销 一个短序列 Demo 输出正常,只能证明那组张量形状走通了。换成长序列、Padding 或混合精度后,掩码广播和显存开销都可能改变。 1. 先写清张量与掩码契约 注意力机制的讨论需要同时说…

2026/8/15 14:45:00

思源宋体TTF快速上手指南:免费商用中文字体的3个部署技巧

思源宋体TTF快速上手指南:免费商用中文字体的3个部署技巧 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 做网站、写文档、出报告的时候,你是不是也遇到过这样的…

2026/8/15 14:40:00

动态合批(Dynamic Batching):每帧现做的“临时打包“

🎬 开场:一个"会动却也能合批"的难题上一讲学了静态合批,小王很开心:不动的物体勾个 Static 就优化了! 但他遇到新问题: 场景里有一堆会飘动的金币 🪙、会飞的子弹 💥、飘…

2026/8/15 9:46:30

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/15 7:22:41

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/15 0:04:00

AI 电动婴儿车智能功率 辅助控制、电源管理的完整选型方案

2026年随着 AI 技术在电动孕婴童用品中的深度渗透(如智能避障、自适应速度控制、能量回收),电动婴儿车对功率器件提出更高要求:高效率、小型化、低功耗、高可靠性。微碧半导体(VBsemi)基于 Trench 及 SGT 工…

2026/8/15 0:04:00

论文AIGC检测不达标完整教程!低门槛用5款工具逐步复检!

论文提交前自己先查一遍AI率,是2026年毕业生的常规动作。学校要求论文AI率低于30%,乃至于20%才能答辩… 很多同学发现一个尴尬的事情:同一篇论文,知网查出来AI率35%,维普查可能是48%,大雅、朱雀又是另外的数…

2026/8/15 9:46:39

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/15 4:56:16

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/15 9:46:30

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…