C语言:自定义类型:联合体与枚举

发布时间:2026/10/1 12:36:59

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/9/24 4:22:00

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

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

2026/9/29 20:34:25

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

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

2026/10/1 0:32:30

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

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

2026/10/1 12:36:51

C++ Qt斗地主源码解析:MVC分层与AI出牌逻辑实战

简介:这是一份面向计算机专业学生的C与Qt期末大作业项目,以单机版斗地主为载体,完整演示了从游戏规则到图形界面的开发流程,适合用于课程设计参考或综合实践练手。资源包为5.76MB的ZIP压缩包,共119个文件,其…

2026/10/1 12:36:51

素数判断算法全解析:从数学原理到C/Java工程优化

素数不是新鲜话题,但每次写代码遇到“判断素数”这种基础问题,总有人把简单的东西搞复杂,或者反过来把朴素的算法用到性能瓶颈。最近我在整理算法笔记,正好把素数这条线从头到尾捋了一遍:从定义、判断、数学性质&#…

2026/10/1 12:36:51

刘强东效仿雷军:创始人IP如何重塑品质零售与履约效率

最近商业圈有件事挺有意思:刘强东做了一件雷军该做的事。放在以前,这个判断可能会让很多人摸不着头脑——一个做自营电商起家的,一个造手机造车的,两个人赛道八竿子打不着。但2025年之后,你再回看这两个人的动作&#…

2026/10/1 12:36:51

AI-Lossless-Zoomer新版路线图:五大功能深度解析

我去年接手过一批90年代老照片的数字化整理,扫描件原图只有72dpi,要放大打印成A3画册,试过Photoshop的插值算法,也试过几款商业放大软件,效果始终差一口气。后来接触到AI-Lossless-Zoomer这个项目,才彻底理…

2026/10/1 12:36:51

五大前端框架(React 19/Vue 3.5/Svelte 5/Solid/Qwik)横向评测与选型指南

1. 这次评测的起因与框架范围 最近在做技术规划时,团队内部连续讨论了好几轮"新兴框架到底选哪个"的问题。React 19正式发布、Vue 3.5稳定落地、Svelte 5带着runes机制重新定义写法、Solid和Qwik也在各自的细分方向上持续迭代。这几年前端框架的更新节奏明…

2026/10/1 12:31:51

基于Spring Boot的废旧物资预约回收系统:毕设项目全链路解析

每年帮学生复审毕业设计的Java项目,我都会遇到同一类题目:基于Spring Boot的业务管理系统。这次拿到的“瑞回宝废旧物资预约回收系统”比较有代表性——题面是一个环保回收业务,背后却串联了Spring Boot后端开发从项目初始化、数据建模、状态…

2026/10/1 5:21:14

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑