C 语言|自定义类型:结构体、联合体与枚举 —— 学习笔记
C语言当中结构体、联合体与枚举属于自定义的数据类型内存排布、参数传递等方面存在不少容易混淆的知识点。本文就结构体、联合体、枚举的基础概念、内存特征以及基本用法展开整理记录学习当中的理解。文章目录结构体struct什么是结构体结构体内存对齐结构体传参联合体共同体union什么是联合体联合体大小及与结构体的区别枚举enum什么是枚举枚举的使用结构体struct什么是结构体struct可以把多种不同类型的数据打包在一起用来描述一个对象。示例一结构体定义、创建变量、初始化访问成员#includestdio.h// 定义结构体模版只是描述格式不开辟内存structStu{charname[20];// 名字intage;// 年龄charsex[5];// 性别charid[20];// 学号};intmain(){// 按顺序给成员赋值初始化structStus1{张三,20,男,202308001};// C99写法指定成员赋值顺序可以随便写structStus2{.age18,.namelist,id202308001,sex女};// 普遍结构体变量用. 访问成员s1.age21;// 结构体指针用 - 访问成员structStu*pss1;ps-age22;return0;}示例二typedef 给结构体起别名#includestdio.h// typedef 给结构体起别名以后不用重复写structtypedefstructStu{charname{20};intage;}Student;intmain(){Student s;s.age19;return0;}结构体内存对齐计算结构体占用内存大小需要遵守三条对齐规则目的是方便CPU读取数据。1. 每个成员存放地址必须是自身类型大小的倍数。2. 结构体总大小必须等于内部最大成员大小的倍数。3. 不满足上面编译器自动补空余字节空余字节不能存数据。特殊#pragma pack预处理指令可以修改编译器默认对齐方式。#includestdio.h// 设置结构体的最大对齐数为1取消内存填充#pragmapack(1)structS{charc1;// 1 1 1inti;// 4 1 4charc2;// 1 1 1};// 恢复编译器原本默认对齐数后面代码不受pack(1)影响#pragmapack()intmain(){// 总大小1 4 1 6字节printf(sizeof(struct S)%d\n,sizeof(structS));return0;}结构体传参两种传参方式值传递、地址传递。函数传参时参数是压栈处理会占用栈空间。如果结构体对象本身规模很大参数压栈的系统开销就会比较大容易导致栈溢出。结论结构体传参优先传结构体的地址。#includestdio.hstructS{intdata[5];intnum;};// 值传递把整个结构体复制一份传给函数// 函数修改的是复制出来的副本不会改外面原数据结构体大的时候开销大存在栈溢出风险voidPrint1(structSs){inti0;for(i0;i5;i){printf(%d ,s.data[i]);}printf(\n%d\n,s.num);}// 地址传递只传结构体地址不复制全部数据开销小规避栈溢出问题// const限制函数不让修改外面原始数据去掉const就可以修改原结构体voidPrint2(conststructS*ps){inti0;for(i0;i5;i){printf(%d ,ps-data[i]);}printf(\n%d\n,ps-num);}intmain(){structSs{{1,2,3,4,5},100};Print1(s);Print2(s);return0;}联合体共同体union什么是联合体关键字union里面可以放多种不同类型变量全部共用同一块内存。改其中一个成员别个成员就会被覆盖。#includestdio.h// 定义联合体类型unionUn{charc;inti;};intmain(){unionUn un{0};// 创建联合体变量un.i0x11223344;// 给int成员赋值printf(修改前 i %#x\n,un.i);un.c0x55;// 修改char会覆盖 int 的低字节共用内存printf(修改后 i %#x\n,un.i)printf(联合体大小%d\n,sizeof(un));return0;}联合体大小及与结构体的区别计算规则联合体最少要等于最大那个成员的字节。联合体的最大对齐数 联合体中最大基础类型成员的字节数如果这个大小不满足最大对齐数的倍数后面补空字节凑够倍数。与结构体的区别核心对比内存结构体每个成员各占一块内存联合体全部成员共用一块内存大小结构体所有成员字节相加再补对齐空位联合体取最大成员大小再补对齐空位使用结构体所有成员可以同时用联合体同一时间只能用其中一个成员枚举enum什么是枚举枚举用关键字enum表示顾名思义就是一 一列举把变量所有可能的取值全部罗列出来。像星期性别三原色取值有限适合使用枚举。规则不给常量写数值第一个默认是0后面依次1。枚举本质是整型常量底层占4字节。枚举常量不可以被赋值修改。示例//星期enumDay{Mon,Tues,Wed,Thur,Fri,Sat,Sun};//性别enumSex{MALE,FEMALE,SECRET};//三原色enumColor{RED,GREEN,BLUE};枚举的使用作用替代程序中含义模糊的魔法数字提升代码可读性同时限制变量只能使用列举出来的合法值减少程序出错。示例

相关新闻

career-ops Provider 层扩展实战:为 scan.mjs 零 Token 扫描器编写公共职位数据源适配模块

career-ops Provider 层扩展实战:为 scan.mjs 零 Token 扫描器编写公共职位数据源适配模块

career-ops Provider 层扩展实战:为 scan.mjs 零 Token 扫描器编写公共职位数据源适配模块 【免费下载链接】career-ops Open-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, …

2026/9/8 15:54:31 阅读更多 →
基于python-pptx的PPT结构化解析:从演示文稿到JSON数据

基于python-pptx的PPT结构化解析:从演示文稿到JSON数据

1. 项目背景:为什么非要把 PPT 变成结构化数据做 PPT 解析这个项目之前,我其实是被一个相当实际的场景逼出来的。公司有一个业务条线,每周都在收不同部门发来的周报、竞品分析、市场情报,形式基本全是 PPT。这些文档堆积在共享盘里…

2026/9/8 15:54:31 阅读更多 →
Java原型模式实战:从浅拷贝到深拷贝,高效复制对象副本

Java原型模式实战:从浅拷贝到深拷贝,高效复制对象副本

如果要在23种设计模式里选一个“看起来鸡肋、用起来真香”的角色,我投原型模式一票。很多同行对它的印象停留在面试题里的Cloneable和clone方法,真到业务代码里,还是老老实实new一个对象再挨个set。这个习惯本身没什么不对,可一旦…

2026/9/8 15:54:31 阅读更多 →

最新新闻

非局部均值图像去噪:原理、代码实现与调参指南

非局部均值图像去噪:原理、代码实现与调参指南

简介:非局部均值去噪是图像处理中兼顾噪声抑制与细节保留的经典算法,在红外图像等复杂场景中尤其有效。这份MATLAB实现资源面向图像处理学习者和工程师,可用于解决实际项目中的噪声干扰与边缘模糊问题。压缩包共8个文件,含4个M脚本…

2026/9/8 16:53:55 阅读更多 →
从Demo到价值闭环:FDE如何破解企业AI落地困局

从Demo到价值闭环:FDE如何破解企业AI落地困局

做企业 AI 这行的朋友,应该都见过这个场面:项目启动会上聚光灯打得很好,供应商把 Agent 演示得行云流水,业务方鼓掌,CTO 点头,PPT 最后一页写着“预计效率提升 300%”。然后三个月后再问,那个项…

2026/9/8 16:53:55 阅读更多 →
降AI率教程:教育学硕士论文AIGC超标4.8元知网一次达标完整操作指南

降AI率教程:教育学硕士论文AIGC超标4.8元知网一次达标完整操作指南

降AI率教程:教育学硕士论文AIGC超标4.8元知网一次达标完整操作指南 帮同学处理过教育学硕士论文降AI率降AI率,流程基本固定,记录下来供参考。 主推工具:嘎嘎降AI(www.aigcleaner.com),知网维普…

2026/9/8 16:53:55 阅读更多 →
Ryzen AI Max+ 395本地跑27B大模型:统一内存架构实战

Ryzen AI Max+ 395本地跑27B大模型:统一内存架构实战

Ryzen AI Max 395这颗芯片,我没有把它当成什么炫技参数,而是真把它当作一台可以随身携带的大模型推理机来用了。128GB统一内存版本,本地部署Qwen3.8-27B,这是我最近折腾过最值得记录的一件事。以前想在笔记本上拉起27B级别的模型&…

2026/9/8 16:53:55 阅读更多 →
降AI率教程:建筑学硕士论文AIGC超标4.8元知网维普一次达标完整操作指南

降AI率教程:建筑学硕士论文AIGC超标4.8元知网维普一次达标完整操作指南

降AI率教程:建筑学硕士论文AIGC超标4.8元知网维普一次达标完整操作指南 同学问过好几次建筑学硕士论文降AI率降AI率怎么操作,干脆写篇教程。嘎嘎降AI(www.aigcleaner.com),降AI率达标率99.26%,4.8元&#…

2026/9/8 16:53:55 阅读更多 →
软硬件一体化团队构建:从嵌入式控制到AI算法的完整链路

软硬件一体化团队构建:从嵌入式控制到AI算法的完整链路

1. 这个项目为什么必须走软硬件一体化事情得从我们正在推进的一个项目说起。团队一直在做传统纹样与数字技术的结合,目前已经整理的纹样素材库接近三千种,针法参数这边积累了二百多套,整个数据底座算是有了一定的规模。但这些数据躺在数据库里…

2026/9/8 16:52:54 阅读更多 →

日新闻

加密资产价值投资:原理、方法与实战策略

加密资产价值投资:原理、方法与实战策略

1. 价值投资视角下的加密资产本质剖析作为践行格雷厄姆-多德学派十余年的价值投资者,我首次接触比特币白皮书时的震撼感至今记忆犹新。那是在2013年的一次金融科技研讨会上,当看到"去中心化电子现金系统"这个定义时,我的职业本能立…

2026/9/8 0:00:18 阅读更多 →
ODT光学测距技术原理与工业应用实践

ODT光学测距技术原理与工业应用实践

1. ODT技术全景解析ODT(Optical Distance Technology)作为现代精密测量领域的核心技术,近年来在工业检测、自动驾驶和医疗影像等领域展现出越来越广泛的应用价值。这项技术通过光学手段实现非接触式距离测量,其典型测量精度可达微…

2026/9/8 0:00:18 阅读更多 →
模板代码版本兼容实战:从单片机到服务端的隐性依赖与重构

模板代码版本兼容实战:从单片机到服务端的隐性依赖与重构

1. 模板代码为什么会"过期":三个最常见的失效场景 先说个我自己的经历。前阵子从旧电脑往新电脑迁移工作区,把一套写了快两年的单片机模板工程直接拷过去,Keil 一打开、编译,满屏的 error。仔细一看,不是芯片…

2026/9/8 0:00:18 阅读更多 →

周新闻

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 9:44:40 阅读更多 →
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 21:08:44 阅读更多 →
基于CNN的调制信号识别:MATLAB实现时频图分类实战

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/8 2:03:15 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/8 0:22:41 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/8 1:17:14 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/8 3:16:24 阅读更多 →