C语言自定义类型讲解:结构体,枚举,联合(2)
🐵本篇文章将会对位段、枚举和联合的相关知识进行讲解
1. 位段📚
1.1 什么是位段
位段的声明和结构体类似,但是有两点不同:
1.位段的成员必须是int,unsigned int,signed int (C99之后也可以是其他成员,但一般是int, char)
2.位段的成员的后面都有一个冒号和一个数字,代表该成员所占的比特位

假如A是一个普通的结构体,那么此时A的大小为16个字节,那么位段A的大小是多少?
struct A
{int a : 2;int b : 5;int c : 10;int d : 30;
};
printf("%zd\n", sizeof(struct A));
得到的结果为8,可以看出位段相比于结构体更能节省空间,那位段是怎么分配内存空间的,为什么A的大小是8个字节?
1.2 位段的内存分配
位段在空间上按照4个字节(int)或一个字节(char)为单位来开辟的,也就是当位段成员主要是int时,它会先开辟4个字节,当不够用时会再开辟4个字节;当位段成员主要是char时,它会先开辟1个字节,当不够用时会再开辟1个字节
除此之外,位段还有许多跨平台问题:
1. int位段究竟是无符号unsigned int还是有符号signed int是不确定的
2. int位段的最大位段数是不确定的,因为在16位机器上int占2个字节,在32位机器上int占4个字节
3. 位段成员在内存中是从左到右分配还是从右到左分配是不确定的,比如还是以上题为例,由于位段成员主要是int类型,所以位段在空间上按4个字节为单位来开辟的,先开辟4个字节:

4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的
比如char位段,先开辟一个字节,a占6个比特位,b占4个比特位

下面以一个例题为例:
struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};int main()
{struct S s = { 0 };s.a = 10;s.b = 12;s.c = 3;s.d = 4;return 0;
}

2. 枚举📚
枚举就是一一列举
2.1 枚举的定义
enum Color
{RED,GREEN,BLUE
};

每一个枚举常量都有对应的值,第一个枚举常量的默认值为0,之后依次递增1,在上述代码中枚举常量RED的值为0,GREEN为1,BLUE为2
enum Color
{RED,GREEN,BLUE
};int main()
{printf("%d", RED); //打印结果为0return 0;
}
我们也可以修改默认值
enum Color
{RED = 3,GREEN,BLUE
};
这样RED的值就变成了3,GREEN和BLUE也依次变为4和5
2.1 枚举的使用
enum Color
{RED,GREEN = 5,BLUE
};int main()
{enum Color clr = GREEN;//给枚举类型的变量赋值时要用枚举常量clr = 6; //这种形式的代码在vs的.c文件中不会报错,这是因为vs的.c文件对类型检查不够严格,当把.c文件改为.cpp文件时,程序就会报错,所以不建议这样写代码return 0;
}
3. 联合📚
3.1 联合的定义
联合体(共用体)也是一种自定义类型,它也包含一系列的成员,它的特征是这些成员共用同一空间
union un
{char c;int i;
};int main()
{union un u; //创建联合体变量printf("%p\n", &u); //求变量的地址printf("%p\n", &u.c); printf("%p\n", &u.i); //求成员的地址return 0;
}

有打印结果可以看出联合体的内部成员共用同一块空间;

在深度剖析数据在内存中的存储中讲解过大小端存储模式,当时写过判断大小端存储模式的代码:


int check_sys()
{int a = 1;return *(char*)&a; //判断该数据的第一个字节是多少
}int main()
{int ret = check_sys();if (ret == 1){printf("小端存储\n");}else{printf("大端存储\n");}return 0;
}
同样我们也可以用联合实现判断大小端的功能
int check_sys()
{union un{char c;int i;}u;u.i = 1;return u.c;
}
3.2 计算联合的大小
联合体的成员共用同一块内存空间,一个联合体变量的大小至少是其最大成员的大小,因为当最大成员的大小不是最大对齐数的整数倍时就要对齐到最大对齐数的整数倍处
union un
{char c[5];int i;
}u;int main()
{printf("%zd", sizeof(u)); //结果为8return 0;
}
上述代码中c的对齐数是1,i的对齐数是4,所以最大对齐数是4,而char c[5]的大小是5个字节,所以要再浪费3个字节对齐到4的倍数也就是8个字节
🙉至此,有关结构体、位段、枚举和联合的知识全部讲解完毕;之后会讲解动态内存管理
相关文章:
C语言自定义类型讲解:结构体,枚举,联合(2)
🐵本篇文章将会对位段、枚举和联合的相关知识进行讲解 1. 位段📚 1.1 什么是位段 位段的声明和结构体类似,但是有两点不同: 1.位段的成员必须是int,unsigned int,signed int (C99之后也可以是其他成员&am…...
AI编程助手 Amazon CodeWhisperer 全面解析与实践
目录 引言Amazon CodeWhisperer简介智能编程助手智能代码建议代码自动补全 提升代码质量代码质量提升安全性检测 支持多平台多语言 用户体验和系统兼容性用户体验文档和学习资源个性化体验系统兼容性 功能全面性和代码质量功能全面性代码生成质量和代码安全性 CodeWhisperer的代…...
利用EXCEL进行XXE攻击
利用EXCEL进行XXE攻击 原因 原因 Microsoft Office从2007版本引入了新的开放的XML文件格式,新的XML文件格式基于压缩的ZIP文件格式规范,由许多部分组成。 我们可以将其解压缩到特定的文件夹中来查看其包含的文件夹和文件,可以发现其中多数是…...
芯片验证就是一次旅行
如果你国庆希望去一个你不曾去过的城市旅行,比如“中国苏州”。对游客来说,它是个蛮大的城市,有许多景点可以游玩,还有许多事情可以做。但实际上,即使最豪也最清闲的游客也很难看苏州的所有方方面面。同样的道理也适用…...
Java深入理解线程的三大特性
目录 1 CPU缓存导致可见性问题2 线程切换导致原子性问题3 性能优化导致有序性问题4 JMM(Java Memory Model)5 volatile6 synchronized 1 CPU缓存导致可见性问题 线程的三大特性: 可见性:Visibility有序性:Ordering原子性:Atomic…...
2025快手校招面试真题汇总及其解答(二)
6. hashmap数据结构 HashMap 是一种散列表,它是一种根据键值对来存储数据的数据结构。HashMap 的特点是插入、查找和删除操作的时间复杂度都是 O(1),因此它是一种非常高效的数据结构。 HashMap 的工作原理是将键值对存储在一个数组中,每个键值对都由一个哈希函数来映射到数…...
PHP生成带中文的图片
imagettftext() 函数是 PHP 中的一个内置函数,用于使用 TrueType 字体将文本写入图像。 句法: 数组imagettftext(资源$image,float $size,float $angle, int $x,int $y,…...
java框架-Dubbo
Dubbo整合Springboot BIO NIO Netty Dubbo 原理 在这里插入图片描述...
Vue+iview 组件中通过v-for循环动态生成form表单进行表单校验
在做项目时,需要根据需要动态添加或新增表单,同时还需要对表单做校验。详情如下图: 刚开始做表单验证的时候,对于这个动态的表单验证有点难搞,试了好几种方法都没有搞定。最后按照下面这种方法实现了,以此…...
sns.load_dataset(“iris“)报错原因探究+解决办法
问题描述 import seaborn as sns # 读取数据 iris sns.load_dataset("iris")在代码中使用了seaborn ,并加载iris数据,结果产生了报错信息如下所示 问题分析 原因很简单,我们使用了sns.load_dataset("iris")来加载数据…...
python回文素数
这能有1和本身整除的整数叫素数;如一个素数从左向右和从右向左是相同的数,则该素数为回文素数。编程求出2-1000内的所有回文素数。 源代码: def sushu(n): for i in range(2,n//21): if n%i 0: return False r…...
纽扣电池16CRF1700.15,16CFR1700.20,ANSI C18.3M如何申请?
随着科技的发展,纽扣电池被广泛应用于小型电子产品,如计算器、电子手表、玩具、医疗设备等。由于其体积小,易于拆卸,也造成了儿童误吞的潜在风险。因此,对于纽扣电池的认证和包装,各国均有相应的规定。 在美…...
10.12广州见 | 第十六届智慧城市大会报名通道全面开启
第十六届中国智慧城市大会 将于10月12日至13日 在广州举办 智慧城市是数字中国、智慧社会的核心载体,是数字时代城市发展的高级形态。由中国服务贸易协会、中国测绘学会、中国遥感委员会主办的第十六届中国智慧城市大会,将以“数实融合开放创新智引未…...
2023-油猴(Tampermonkey)脚本推荐
2023-油猴(Tampermonkey)脚本推荐 知乎增强 链接 https://github.com/XIU2/UserScript https://greasyfork.org/zh-CN/scripts/419081 介绍 移除登录弹窗、屏蔽首页视频、默认收起回答、快捷收起回答/评论(左键两侧)、快捷回…...
某度sign参数逆向
文章目录 前文分析完整代码结尾 前文 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 分析 经过我们几次抓包,测试…...
【选型】JAVA生成PPT及选型
可以使用的框架(类库):POI,OpenOffice/LibreOffice,Aspose.Slides,Java开源报表工具(JasperReports,BIRT等)。 具体如下: 方案优点缺点Apache POI- 开源免费- 可完全控制PPT生成- …...
LPA*算法图文详解
之前我们看过了A* 算法,知道了A* 算法的基本原理,但是A* 算法的缺陷也很明显:它是离线的路径规划算法,只能一次规划出路径,但是后面路径被改变的话就无法生效了。针对这个问题,人们研究出了D* 算法。D* 算法…...
【Unity的HDRP渲染管线下实现好用的GUI模糊和外描边流光效果_Blur_OutLine_案例分享(内附源码)】
实现好用的模糊效果_Blur HDRP渲染管线下搭建场景创建RenderTextureRenderTexture 与相机的配置:UI层 Canvas的不同Render Mode:Canvas 在Screen Space - Overlay 模式下:UI旋转Y轴,没有透视。切换到Screen Space - Camera 模式下:UI层跑到物体后面去了,将Plane Distance…...
电脑D盘格式化会有什么影响?电脑D盘格式化了怎么恢复数据
当电脑出现问题时,往往会出现一些提示,例如提示格式化的问题,而最近有位小伙伴也遇到了相似的问题,即D盘一打开就显示格式化,由于不清楚D盘格式化会有什么影响,因此不小心进行了格式化操作,结果…...
【Spring】多环境切换
🎈博客主页:🌈我的主页🌈 🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏 🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩…...
TVA动态阈值在昇腾310的适配要点
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
预训练+微调实现TVA模型快速部署
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
避开这3个坑,你的STM32F103+LoRa+阿里云项目才能跑得稳
STM32F103LoRa阿里云物联网项目稳定性优化实战指南 在物联网设备开发中,稳定性往往是区分业余原型与工业级产品的关键分水岭。许多开发者能够快速搭建起STM32F103与LoRa模块的基础通信框架,并实现阿里云物联网平台的数据上传,却在长期运行中频…...
5个技巧快速掌握Happy Island Designer:免费在线岛屿设计工具终极指南
5个技巧快速掌握Happy Island Designer:免费在线岛屿设计工具终极指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)",是一个在线工具,它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(A…...
【NotebookLM文学研究辅助终极指南】:20年数字人文专家亲授3大高阶用法,92%学者忽略的文本洞察捷径
更多请点击: https://kaifayun.com 第一章:NotebookLM文学研究辅助的范式革命 传统文学研究长期依赖人工精读、笔记摘录与跨文本比对,耗时且易受主观经验局限。NotebookLM 的引入,标志着从线性阅读向语义驱动、上下文感知、可追溯…...
Audacity音频编辑:从新手到专业创作者的免费音频处理方案
Audacity音频编辑:从新手到专业创作者的免费音频处理方案 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 你是否曾经想过编辑一段音频,却因为昂贵的软件而却步?或者想要录制播客…...
构建多模型智能客服时如何借助 Taotoken 实现灵活路由与降级
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 构建多模型智能客服时如何借助 Taotoken 实现灵活路由与降级 在构建企业级智能客服系统时,服务的稳定性和响应能力至关…...
i.MX8MP NPU实战:TensorFlow Lite模型移植与VSI-NPU优化全流程
1. 项目概述与核心价值最近在折腾一块基于NXP i.MX8M Plus的开发板,这块板子最大的亮点就是集成了一个专为边缘AI设计的神经处理单元(NPU)。官方文档里提了一嘴TensorFlow Lite的例程,但真上手去移植,发现坑是一个接一…...
紧急通知:NotebookLM v2.3将移除手动标签覆盖功能!立即执行这5项存量标签加固操作,否则知识链永久断裂
更多请点击: https://intelliparadigm.com 第一章:NotebookLM标签管理方法 NotebookLM 原生不提供显式的“标签(Tags)”UI 控件,但可通过其底层的 source 元数据机制实现语义化标签管理。核心思路是将标签作为自定义…...
【NotebookLM概念关联分析黄金法则】:谷歌内部未公开的3类关联强度阈值,错过将影响RAG响应质量
更多请点击: https://intelliparadigm.com 第一章:NotebookLM概念关联分析黄金法则总览 NotebookLM 是 Google 推出的基于用户自有文档构建可信知识代理的 AI 工具,其核心能力在于对上传 PDF、TXT 等文本进行语义理解与跨文档概念锚定。实现…...

