枚举(enum)+联合体(union)
枚举+联合
- 一.枚举类型
- 1.枚举类型的声明
- 2.枚举类型的优点
- 3.枚举类型的使用
- 二.联合体
- 1.联合体类型的声明
- 2.联合体的特点
- 3.相同成员的结构体和联合体对比
- 4.联合体大小的计算
- 5.联合体的练习(判断大小端)
- 6.联合体节省空间例题
一.枚举类型
1.枚举类型的声明
- 枚举顾名思义就是一一列举,把可能的取值一一列举。
比如我们现实生活中:
- 一周的星期⼀到星期日是有限的7天,可以一一列举。
- 性别有:男、女、保密,也可以一一列举。
- 月份有12个月,也可以一一列举。
- 三原色,也是可以一一列举。
这些数据的表示就可以使用枚举了,代码如下:
#include<stdio.h>
enum Day//星期
{//该枚举类型有七种可能值,它们都是常量,被称为枚举常量Mon,Tues,Wed,Thur=9,Fri,Sat,Sun
};
int main()
{enum Day day1 = Mon;enum Day day2 = Sun;printf("%d\n", Mon);//0printf("%d\n", Tues);//1printf("%d\n", Wed);//2printf("%d\n", Thur);//9printf("%d\n", Fri);//10printf("%d\n", Sat);//11printf("%d\n", Sun);//12return 0;
}
- 以上定义的 enum Day ,是枚举类型。
- { }中的内容是枚举类型的可能取值,也叫枚举常量。
- 枚举类型的值通常是整数常量。
- 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值,后面的值也是依次递增1。
2.枚举类型的优点
- 我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
-
增加代码的可读性和可维护性。
-
和 #define 定义的标识符比较枚举有类型检查,更加严谨。
-
便于调试,预处理阶段会删除 #define 定义的符号。
-
使用方便,一次可以定义多个常量。
-
枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。
3.枚举类型的使用
- 枚举举例:写一个计算器完成整数的加法,减法,乘法,除法
#include<stdio.h>
enum Option
{EXIT,//0ADD,//1SUB,//2MUL,//3DIV//4
};
void menu()
{printf("*************************\n");printf("**1:add 2:sub**\n");printf("**3:mul 4:div**\n");printf("**0:exit \n");printf("*************************\n");
}
int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}
int Cal(int(*pf)(int, int))
{int ret = 0;int x = 0;int y = 0;printf("请输入两个数:>");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
}
int main()
{int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case ADD:Cal(Add);break;case SUB:Cal(Sub);break;case MUL:Cal(Mul);break;case DIV:Cal(Div);break;case EXIT:printf("退出\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}
二.联合体
1.联合体类型的声明
- 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型,但是编译器只为最大的成员分配足够的内存空间。
- 联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共用体。
#include<stdio.h>
union Un//联合体
{char c;int i;
};
int main()
{printf("%zd\n", sizeof(union Un));//4个字节return 0;
}
- 运行可知联合体union Un只占用4个字节,这是为什么呢?
2.联合体的特点
- 联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
- 修改联合体其中⼀个成员,其他成员的值也跟着变化。
#include<stdio.h>
union Un
{char c;int i;
};
int main()
{union Un un = { 0 };printf("& un =%p\n", &un);printf("&(un.c)=%p\n", &(un.c));printf("&(un.i)=%p\n", &(un.i));return 0;
}
#include <stdio.h>
//联合类型的声明
union Un
{char c;int i;
};
int main()
{//联合变量的定义 union Un un = { 0 };un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);//11223355return 0;
}
3.相同成员的结构体和联合体对比
#include<stdio.h>
struct S//结构体
{char c;int i;
};
union Un//联合体
{char c;int i;
};
int main()
{printf("%zd\n", sizeof(struct S));//8个字节printf("%zd\n", sizeof(union Un));//4个字节return 0;
}
- 对比一下相同成员的结构体和联合体的内存布局情况。
4.联合体大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,联合的大小就是最大对齐数的整数倍。
#include<stdio.h>
union Un
{char arr[5];//相当于五个char变量,char c1;char c2;char c3;char c4;char c5;//自身大小:1,默认对齐数:8,对齐数:1int i;//自身大小:4,默认对齐数:8,对齐数:4//二者的最大对齐数是4,联合体的总大小是4的倍数,//而5不是4的倍数,所以联合体的大小是8
};
union Un2
{short c[7];//14 2 8 2int i;// 4 8 4
};
int main()
{printf("%zd\n", sizeof(union Un));//8printf("%d\n", sizeof(union Un2));//16return 0;
}
5.联合体的练习(判断大小端)
#include<stdio.h>
int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c;//返回1是小端,返回0是大端
}
int main()
{if (check_sys() == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
6.联合体节省空间例题
- 比如,我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
- 图书:书名、作者、页数。
- 杯子:设计。
- 衬衫:设计、可选颜色、可选尺寸。
那我们不耐心思考,直接写出以下结构:
#include<stdio.h>
struct gift_list
{//公共属性 int stock_number;//库存量 double price; //定价 int item_type;//商品类型 //特殊属性 char title[20];//书名 char author[20];//作者 int num_pages;//页数 char design[30];//设计 int colors;//颜色int sizes;//尺寸
};
- 上述的结构其实设计的很简单,用起来也方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。
比如:
- 商品是图书,就不需要design、colors、sizes。所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存,代码如下:
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;//g.item.book.num_pages=20;
}g;
创作不易,如果能帮到你的话能赏个三连吗?感谢啦!!!
相关文章:

枚举(enum)+联合体(union)
枚举联合 一.枚举类型1.枚举类型的声明2.枚举类型的优点3.枚举类型的使用 二.联合体1.联合体类型的声明2.联合体的特点3.相同成员的结构体和联合体对比4.联合体大小的计算5.联合体的练习(判断大小端)6.联合体节省空间例题 一.枚举类型 1.枚举类型的声明…...

postman教程-15-前置脚本
上一小节我们学习了Postman生成随机数的方法,本小节我们讲解一下Postman前置脚本的使用方法。 Postman中的前置脚本(Pre-request Script)允许你在发送请求之前运行JavaScript代码。这可以用于修改请求头、查询参数、请求体等,或者…...

AIGC会带来失业潮吗?紧紧跟时代第一步,如何学习AIGC
会,但AI淘汰的始终是跟不上时代的人。 现在很多公司都有AI培训,不仅GPT,还有Midjourney、Stable DIffusion等一系列AI工具。 像我们公司虽然今年招的少,但也会对新招的应届生统一进行AI培训。 用任正非先生的话来说就是&#x…...

C++第二十四弹---从零开始模拟STL中的list(上)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、基本结构 2、基本函数实现 2.1、默认构造函数 2.2、尾插数据 3、迭代器的封装 3.1、迭代器的基本结构 3.2、迭代器重载函数的实现 4、迭…...
大宋咨询(深圳社情民意调查)关于社情民意调查研究的内容
社情民意调查内容,是一项至关重要的社会研究活动,它涵盖了社会生活的方方面面,通过深入了解民众的需求、态度和看法,为决策提供了宝贵的参考依据。 首先,社会经济状况是社情民意调查不可或缺的一部分。这包括了对当地…...

PID算法在电机速度控制上的应用
目录 概述 1 系统硬件框架 1.1 框架介绍 1.2 硬件实物图 2 STM32Cub生成工程 2.1 软件版本信息 2.2 配置参数 编辑2.3 生成项目 3 PID算法实现 3.1 概念 3.2 代码实现 4 其他功能实现 4.1 设置电机速度 4.2 PID算法控制电机 4.3 功能函数的调用 5 测试 5.1 …...

埃隆·马斯克 - 从梦想家到改变世界的企业家
埃隆马斯克 - 从梦想家到改变世界的企业家 本文内容是埃隆马斯克传的重点章节精华提炼,介绍了马斯克传奇一生 参考资料内容:埃隆马斯克传&造梦者埃隆马斯克 参考资料在文末获取,关注我,分享优质前沿资料(IT、运…...
微信小程序长图片自适应
/*wxss中的代码*/ .image-container { display:flex;width: 100%; /* 或其他需要的宽度 */ /* margin-bottom: 10px; //图片之间的间距 */height: auto; } 核心:要真正自适应,就要在wxml中加入固定宽度style“width:750rpx” /*wxml中的代码*/ &l…...

elasticsearch hanlp 插件安装操作
elasticsearch hanlp 插件安装操作 下载 hanlp 插件上传hanlp插件到elasticsearch服务器安装hanlp插件kibana测试 下载 hanlp 插件 这里大家根据自己对应的 elasticsearch 版本下载匹配版本的 hanlp 插件,由于 hanlp 及 elasticsearch 各个版本之间差别较大&#x…...

为什么进程和线程 ID 总是 4 的倍数?
如果您研究下任务管理器中的的进程 ID (PID),则你会发现这样一个规律:它们都是 4 的倍数。 基于 Windows NT 内核的操作系统上,不止是进程 ID,实际上,线程 ID (TID) 也遵守这样的规律:也即它们都是 4 的倍…...

LabVIEW版本控制
LabVIEW作为一种流行的图形化编程环境,在软件开发中广泛应用。有效地管理版本控制对于确保软件的可靠性和可维护性至关重要。LabVIEW提供了多种方式来管理VI和应用程序的修订历史,以满足不同规模和复杂度的项目需求。 LabVIEW中的VI修订历史 LabVIEW内置…...

不输Kimi的AI插件——Elmo Chat (免费,无需注册)
🌚 前阵子不是写了篇《一分钟上手AI神器——Kimi (附_ 官方提示词)》 嘛,给大伙安利了一波 Kimi Chat 这个AI 神器,不知道是不是用户量上来了,算力一下子跟不上,感觉变笨了不少🤣。在别的推文看到多轮对话后…...

使用cesiumLab使shp转为3dtlies
过程不做赘述,网上大把,说下注意事项。 1. 存储3DTiles 选项 若是打开则输出的文件为glb格式文件,因为glb文件好储存易传输跨平台。cesium可以使用但无法处理,例如改变颜色,改着色器等。若是不打开则输出的文件为bm3d格式文件,此…...

中科数安 | 透明加密防泄密系统!如何有效防止企业内部核心数据资料外泄?
中科数安提供的透明加密防泄密系统是一种专为企业设计的数据保护解决方案,它通过以下关键特性有效防止企业内部核心数据资料外泄: PC地址:——www.weaem.com 自动智能透明加密:系统能够在操作系统级别无缝集成,对指定类…...

go的反射和断言
在go中对于一个变量,主要包含两个信息变量类型(type)和变量值(value) 可以通过reflect包在运行的时候动态获取变量信息,并能够进行操作 对于Type可以通过reflect.TypeOf()获取到变量的类型信息 reflect.Ty…...

打造新引擎,迈向数智金融新未来
数智技术正在全面赋能金融机构转型升级以及促进金融与实体经济的加速融合,已呈现出金融机构数智化经营加速、产业 数字金融深度融合、数字技术驱动绿色金融发展、金融信创成果涌现、金融机构加快数字化组织管理变革等行业趋势。 根据银行业协会调研,78%…...

广东智慧物流2024年端午节放假安排
广东智慧物流2024年端午节放假安排...

Facebook的隐私保护挑战:用户数据安全的新时代
在全球范围内,Facebook已经成为了不可忽视的社交媒体巨头,它连接着超过20亿的活跃用户。然而,随着其影响力的不断扩大,关于用户隐私和数据安全的问题也愈加引人关注。本文将深入探讨Facebook面临的隐私保护挑战,以及它…...

Gradio.NET:一个快速制作演示demo网页的利器
Gradio介绍 Gradio是一个用于创建机器学习模型交互界面的Python库。它允许开发者快速为他们的模型创建一个简单的web界面,以便于非技术用户和其他开发者进行交互和测试。 Gradio的主要优点是易用性和灵活性。你只需要几行代码就可以为你的模型创建一个交互界面。你…...
001 IOC与DI(有点杂)
文章目录 IOC与DI区别联系总结 依赖注入解耦管理对象的生命周期提高配置灵活性三种注入方式不可变对象的设计 构造器注入Setter方法注入字段注入Setter方法注入为什么不破坏封装性字段注入为什么破坏封装性为什么将字段或setter方法设置为private?总结 setter方法注…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...