C语言自定义类型联合和枚举(25)
文章目录
- 前言
- 一、联合体
- 联合体的声明
- 联合体的特点
- 联合体和结构体内存布局对比
- 联合体的大小计算
- 联合体的实际使用样例
- 礼品兑换单
- 判断当前机器是大端还是小端
- 二、枚举
- 枚举的定义
- 枚举类型的声明
- 枚举类型的优点
- 枚举类型的使用
- 总结
前言
关于自定义类型除了我们常用的结构体,其实还有联合与枚举也是属于自定义类型
我们也来学习一下吧!
一、联合体
联合体的声明
联合体是一个或多个成员组成,其中成员可以是不同类型,并且所有成员共用同一块内存空间,所以联合体也称为共用体。联合体声明的关键字是union
//联合体类型的声明
union Un
{// 1 + 4 == 5 吗?char c; // 1int i; // 4
};
int main()
{union Un un;// 联合体的定义sizeof("%zd\n,sizeof(un)"); // 4return 0;
}
联合体的特点
- 联合体所有成员共用同一块内存空间,一个联合体变量的大小,至少是最大成员的大小,编译器只为最大的成员分配足够大的空间
- 给联合体其中一个成员赋值,其他成员的值也会变化
我们不妨来两段代码来详细感受一下这个性质:
// 代码一
union Un
{char c;int i;
};int main()
{union Un un = {0};// 下⾯输出的结果是⼀样的吗?// 结果:001AF85C// 001AF85C// 001AF85Cprintf("%p\n", &(un.i));printf("%p\n", &(un.c));printf("%p\n", &un);return 0;
}
// 代码二
union Un
{char c;int i;
};int main()
{union Un un = {0};un.i = 0x11223344;un.c = 0x55;// 结果:11223355printf("%x\n", un.i);return 0;
}
如果用一幅图来说明,那就是如下:
从代码一输出的结果是相同的,说明联合体中成员变量是一块空间存储
从代码二输出中,第四个字节的内容被修改位55,对联合体中成员赋值,会影响联合体的全部成员,char类型只占用一个字节
还记得前面的内容不,请在十秒内说出这是小端存储还是大端存储?
答案是小端!
联合体和结构体内存布局对比
我们再来比较一下同样成员变量情况下,两种结合方式的区别来加深印象:
struct Su
{char c;int i;
}S;Union Un
{char c;int i;
}un;
结构体是通过以为空间换取时间设计,而联合体是节省空间
联合体的大小计算
- 联合体的大小至少是最大成员的大小
- 当最大成员大小(联合体总大小)要对齐到最大对齐数的整数倍
请注意,很多学习资料都说联合体的大小就是最大成员的大小,其实这是不对的!
事实上,联合体也是有内存对齐的,下面我们就来举例说明
#include <stdio.h>union Un1
{char c[5]; int i;
}; // 最大对齐数位4,最大成员大小为5,对齐到8是最大对齐数的整数倍union Un2
{short c[7];int i;
}; // 最大对齐数位4,最大成员大小为7,对齐到16是最大对齐数的整数倍int main()
{printf("%zd\n", sizeof(union Un1)); // 8printf("%zd\n", sizeof(union Un2)); // 16return 0;
}
联合体的实际使用样例
礼品兑换单
事实上你可以观察下这种做法,把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体处理,其实是在一定程度上节省了内存
struct gift_list
{int stock_number; // 库存量double price; // 定价int item_type; // 商品类型// 甚至还使用了匿名结构体、联合体union{struct{char title[20]; // 书名char author[20]; // 作者int num_pages; // ⻚数}book;struct{char design[30]; // 设计}mug;struct{char design[30]; // 设计int colors; // 颜⾊int sizes; // 尺⼨}shirt;}item;
};
判断当前机器是大端还是小端
这算是一个巧思,很妙,因为联合体公用一个空间,相当于我是把一个int变量的第一个字节的数据单独提取出来,如果最后返回的是1,那说明低字节位放数据低位,事实也确实是这样,也就说明小端是答案
union un
{char c;int i;
};bool check_sys()
{union un u;u.i = 0x00000001;return u.c;
}int main()
{if (check_sys()){printf("小端\n"); // YES}else printf("大端\n");return 0;
}
二、枚举
枚举的定义
枚举顾名思义就是一一列举,而列举可能的取值是用于定义一组具有离散值的常量,使数据更简洁、方便使用,关枚举的关键字enum
枚举类型的声明
enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};enum Sex
{Man,Woman;
}
以上定义的enum Day、enum Sex都是枚举类型,而{ }中枚举类型的可能取值称为枚举常量
枚举类型的优点
我么可以用宏来定义常量,那么这里为什么还要单独设立一种数据类型呢?
- 增加代码的可读性和可维护性
- 枚举类型有类型检查,更加严谨
- 便于调试,预处理阶段会删除#define定义的符号
- 一次可以定义多个枚举常量,使用方便
- 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
枚举类型的使用
enum Color
{Red=2,Blue=1
}enum Color clr = Blue;
enum Color clr = 2;
这种写法可以么,毕竟2也是Red的值,应该支持隐式类型转换吧!
嗯…最好不要,C语言可以;Cpp不行,Cpp检查比较严格
那有没有具体一点的应用场景呢?
有,我们稍微回顾一下之前的扫雷
运用了枚举这个技巧后:
关于枚举其实我们后来还会有很多的应用场景,这就需要大家自己去慢慢发现了!
总结
其实中途跳过去写Cpp了,现在再跳回来…
反复横跳!
相关文章:

C语言自定义类型联合和枚举(25)
文章目录 前言一、联合体联合体的声明联合体的特点联合体和结构体内存布局对比联合体的大小计算联合体的实际使用样例礼品兑换单判断当前机器是大端还是小端 二、枚举枚举的定义枚举类型的声明枚举类型的优点枚举类型的使用 总结 前言 关于自定义类型除了我们常用的结构体&…...
Kafka 的重平衡问题详解及解决方案
引言 Kafka 是目前非常流行的分布式消息队列系统,被广泛应用于流数据处理、日志分析、事件驱动架构等场景中。Kafka 的高吞吐量和分布式架构在应对海量数据传输方面具有显著优势。然而,Kafka 在处理消费者组时,会面临一个核心问题——重平衡…...
比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别?
比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别? 正确提问失败提问异同 正确提问 ####一堆python源码############# 这里如何根据数据是新建还是更新来调用不同的save方法? 失败提问 ####一堆python源码############# 为什么在修改…...

jmeter学习(1)线程组与发送请求
1、线程组 执行顺序 :setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1)Http请求默认值 作用范围是该线程组下的所有HTTP请求,如果http请求设置的与默认值冲突࿰…...
【小技巧】mysql 判断表字段是否存在 删除字段 sql脚本
MySQL 判断表字段是否存在 删除字段 sql脚本 下面是一个包含插入和更新操作的流程: -- 先尝试插入数据 INSERT IGNORE INTO user_info (last_name, first_name) VALUES (x, y);-- 如果插入成功,ROW_COUNT() 返回 1,否则返回 0 IF ROW_COUNT…...
低代码革命:重塑工业互联网的未来版图
在数字化转型的浪潮中,低代码应用正以前所未有的速度席卷各行各业,尤其是在工业互联网领域,它正悄然改变着企业的技术架构和业务模式。本文将深入探讨低代码应用如何成为工业互联网的技术趋势,并展望其未来的辉煌前景,…...

KNN算法
KNN算法 一 KNN算法介绍二 KNN算法API2.1 KNeighborsClassifier 分类算法2.2 KNeighborsRegressor 回归算法 三 两个经典案例3.1 鸢尾花案例3.2 手写数字识别案例 一 KNN算法介绍 K-近邻算法(K Nearest Neighbor,简称KNN).比如根据你的“邻居…...
TS 中类型的继承
在 TypeScript(TS)中,类型的继承通常通过接口(Interfaces)和类(Classes)来实现。接口提供了一种定义对象形状的方式,而类则提供了一种创建对象实例的方式。以下是如何在 TypeScript …...

在VS code 中部署C#和avalonia开发环境
要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境,您可以按照以下步骤进行: 1. 安装 .NET SDK 下载 .NET SDK: 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK,并下载安装程序。安装 .NET SDK࿱…...
Windows删除service服务
Windows删除service服务 找到命令提示符: 右键,以管理员身份运行 输入: sc delete 服务名 Windows根据TCP端口号查找进程PID再kill进程_windows tcpkill-CSDN博客文章浏览阅读5.3k次,点赞42次,收藏104次。Windows根据…...

【数据结构】---图
图 前言 本篇作为图的基础概念篇, 了解图的离散数学定义, 图的分类, 图模型解决的问题(图的应用), 图的相关算法(仅仅介绍,具体不在此篇展开)。 学习基本路线ÿ…...

《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!
本篇博客深入探讨了 C 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景,然后详细分析了它们的实现方法,包括高效接口设计和性能优化策略。接着,我们通过对比这两种数据结构的性能,探讨了…...

相机基础概念
景深: 景深的定义 DOF:depth of filed 是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。定义3:在镜头前方(焦点的前、后)有一…...

【python】追加写入excel
输出文件运行前(有两张表,“表1”和“Sheet1”): 目录 一:写入单表(删除所有旧工作表,写入新表)二:写入多表(删除所有旧工作表,写入新表&#x…...
继承实现单例模式的探索(二)
前言 本篇文章继续探索通过继承实现单例模式的可行方案,这次的方案将采用反射机制隐式创建派生类实例,示例代码为C#。 代码 v1.0 using System.Reflection;/// <summary> /// 单例模式基类 /// </summary> /// <typeparam name"T&…...

设计模式-访问者模式
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使得在不改变个元素的类的前提下定义作用于这些元素的新操作。...
国创——基于Unity3D和MediaPipe构建虚拟人物驱动系统
以下是一个基于Unity3D和MediaPipe构建虚拟人物驱动系统的基本概念和简化的Python示例代码框架。请注意,这只是一个基础示例,实际应用中可能需要更多的完善和调整。 一、整体概念 1. MediaPipe - MediaPipe是一个用于构建多模态(例如视频、…...

环境可靠性
一、基础知识 1.1 可靠性定义 可靠性是指产品在规定的条件下、在规定的时间内完成规定的功能的能力。 可靠性的三大要素:耐久性、可维修性、设计可靠性 耐久性:指的是产品能够持续使用而不会故障的特性,或者说是产品的使用寿命。 可维修性&a…...

Chromium 设置页面打开系统代理源码分析c++
1、前端页面调用showProxySettings() {chrome.send("showProxySettings")} 2、c 响应代码如下 chrome\browser\ui\webui\settings\system_handler.ccvoid SystemHandler::RegisterMessages() {web_ui()->RegisterMessageCallback("showProxySettings",b…...

信号检测理论(Signal Detection Theory, SDT)
信号检测理论(Signal Detection Theory, SDT)模拟是一种实验设计,用于研究和理解在存在噪声或不确定性的情况下如何做出决策。在心理学、认知科学、工程学和许多其他领域,信号检测理论都非常重要。 一、基础概念: 在信…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...