C语言:自定义类型——联合和枚举

一、联合体

1.1 联合体类型的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以是不同的类型。

声明方式如下图:

那联合体和结构体究竟有什么区别呢??

下面将重点讲解联合体的特点!!

1.2 联合体的特点

1.2.1 特点1

所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体

我们可以发现,三个地址打印出来是一样的。那既然都共用一块空间,那大小有多大呢??

1.2.2 特点2

编译器只为最大的成员分配⾜够的内存空间(因为联合体至少得有能力保护最大的那个成员)

1.2.3 特点3

给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

这里为什么打印出来的是11223355呢,我们根据3个特点,可以分析画出un的内部布局图

充分说明了特点3!

1.3 联合体的大小

特点2提到,编译器只为联合体最大的成员分配足够的空间,那联合体的大小就一定等于最大成员变量的大小吗??

答案是不对的,我们可以看看下面的代码

我们可以验证出,虽然编译器只为最大的成员分配足够空间,但不代表联合体的大小就是最大成员变量的大小!!!

联合体的大小要遵循以下两个特点:

1、联合的大小⾄少是最⼤成员的大小。

2、当最⼤成员大小不是最大对齐数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

这说明,联合体虽然可以节省空间,但也不是一味地节省,他也是有自己的对齐规则的。

分析上图代码:

Un1的第一个成员数组虽然是5个字节的大小,但是最大对齐数只能取char类型,所以是1,而int是4,所以Un1的最大对齐数是4,为了保证能放下5个字节的空间,所以最大对齐数翻倍变成8!

Un2的第一个成员数组虽然是14个字节的大小,但最大对齐数只能取short类型,所以是2,而int是4,所以Un2的最大对齐数是4,为了保证能放下14个字节的空间,所以最大对齐数翻4倍变成16!

1.4 相同成员的结构体和联合体的对比

我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。

这说明使用联合体是可以节省空间的!!!

1.5 使用联合体节省空间的例子

⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息

其他信息:

图书:书名、作者、⻚数

杯⼦:设计

衬衫:设计、可选颜⾊、可选尺⼨

如果直接用结构体的话

但我们会发现,如果创建book变量,那设计、颜色、尺寸属性就会浪费掉。如果创建cup变量,那书名、作者、页数、可选颜色、尺寸属性就会浪费掉。如果创建shirt变量,那书名、作者、页数属性就会浪费掉。这样就会导致内存出现浪费,因为对于礼单兑换单的商品来说,只有部分属性是通用的,所以我们就可以将公共属性单独写出来,剩余属于各种商品自身属性使用联合体联合起来没这样就可以减少所需的内存空间,再一定程度上节省内存,使得程序更加高效运行。

因为我们每个变量只使用一次,所以可以直接使用匿名结构体。

1.6 运用联合体判断大小端

1.7 利用联合体打印存储的字节内容

既然可以判断大小端,那其实也可以直接把存储的情况打印出来!!这是一个很神奇的代码!

二、枚举类型

2.1 枚举类型的声明

枚举顾名思义就是⼀⼀列举。

把可能的取值⼀⼀列举。

⽐如我们现实⽣活中:

⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举

性别有:男、女、保密,也可以⼀⼀列举

⽉份有12个⽉,也可以⼀⼀列举

三原⾊,也是可以意义列举

{ }中是枚举类型的可能取值,也叫做枚举常量。

这些可能取值本身都是由值的,默认是从0开始依次递增1,当然我们在声明的时候也可以自己赋初值,但是定义完成之后,就不能在该类型的外部去修改了!!

2.2 枚举类型的优点

1、增加代码的可读性和可维护性

比如我们在实现游戏时常常会这样去写

此时如果不和菜单建立联系

我们并不能一下子就看出来case1和case0的含义,可读性较差,可如果在这边使用枚举类型,就可以增加代码的可读性,并且后期在维护的时候也方便。

2、 和#define定义的标识符⽐较枚举有类型检查,更加严谨。

#define定义的标识符是不过是一个符号,而枚举是一种类型,有类型检查写代码会更加严谨

3、 便于调试,预处理阶段会删除 #define 定义的符号

枚举类型在调试的时候会显示出成员名,但是#define就不会,标识符会直接替换成数字,后期如果需要调试找错误就不利于发现问题

4.、使⽤⽅便,⼀次可以定义多个常量

5.、枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

枚举有作用域的概念,在一个函数内部使用,出了函数就不能用了,但是#define定义的标识符没有作用域概念,他是一个全局都可以使用的常量。

2.3 枚举类型的使用

使用方法:使⽤枚举常量给枚举变量赋值

那是否可以拿整数给枚举变量赋值呢?

在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐ 较严格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断交叉编译工具是否支持C++20的标准

写个任意的测试程序hello_world 执行 arm-linux-gnueabihf-g -stdc14 main.cpp arm-linux-gnueabihf-g -stdc17 main.cpp arm-linux-gnueabihf-g -stdc20 main.cpp没报错则代表支持,报错则不支持.

数字图像处理常用算法的原理和代码实现详解

本专栏详细地分析了常用图像处理算法的数学原理、实现步骤。配有matlab或C实现代码,并对代码进行了详细的注释。最后,对算法的效果进行了测试。相信通过这个专栏,你可以对这些算法的原理及实现有深入的理解!   如有疑问&#xf…

公司想做一套数字化管理系统,该怎么做?

引言 一个老板的心声:随着科技的迅猛发展,公司数字化已经成为提升业务竞争力不可或缺的关键因素。在这个数字时代,我们公司旨在顺应潮流,迎接挑战,以构建一套强大而高效的数字化管理系统为目标。通过本系统&#xff0…

8路DI高速计数器,8路DO支持PWM输出,Modbus TCP模块 YL93 开关量输入输出

特点: ● 8路开关量输入,8路开关量输出 ● DI每一路都可用作计数器或者频率测量 ● DO每一路都可独立输出PWM信号 ● DI和DO都支持PNP,NPN切换功能 ● 支持Modbus TCP 通讯协议 ● 内置网页功能,可以通过网页查询电平状…

安达发|APS计划排产排程排单软件功能解析

APS计划排产排程排单软件是一种用于生产计划和排程的工具,它可以帮助制造企业实现高效、准确的生产计划和排程。该软件具有多种功能,包括可视化人机互动排产、一键式全自动排产、设备产能约束排产、模具约束排产、人员约束排产、半成品约束排产、物料齐套…

Unity | 渡鸦避难所-7 | 攻击碰撞检测

1 前言 英雄的宝剑并非只是装饰物,利剑出鞘时可以对怪物造成伤害。同样,怪物挥出铁拳时也会对英雄造成伤害。当然,都有同样的前提:在武器碰到对方的情况下,才会造成伤害。利用物理引擎,可以轻松的实现碰撞…

SparkSQL——(扩展) Cataylst

(扩展) Cataylst 优化器 RDD 和 SparkSQL 运行时的区别 RDD 的运行流程 大致运行步骤: 先将 RDD 解析为由 Stage 组成的 DAG, 后将 Stage 转为 Task 直接运行 问题: 任务会按照代码所示运行, 依赖开发者的优化, 开发者的会在很大程度上影响运行效率 解决…

图像分类 | 基于 Labelme 数据集和 VGG16 预训练模型实现迁移学习

Hi,大家好,我是源于花海。本文主要使用数据标注工具 Labelme 对自行车(bike)和摩托车(motorcycle)这两种训练样本进行标注,使用预训练模型 VGG16 作为卷积基,并在其之上添加了全连接…

【OpenCV学习笔记14】- 图像的几何变换

这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔…

Notepad++运行C语言输出乱码

方法一:编码-编码字符集-中文-GB2312 这时原程序中文会变成乱码,我是重新输入中文 重新编译执行即可 缺陷:重开一个程序有中文还是会显示乱码,需要重新设置编码,比较麻烦 方法二:设置-首选项-新建-右侧编…

[SWPUCTF 2022 新生赛]ez_rce

[SWPUCTF 2022 新生赛]ez_rce wp 题目页面: 这个页面真的什么都没有。 目录爆破 dirsearch -u "http://node5.anna.nssctf.cn:28677/"返回结果: 访问 /.gitignore 页面 提示 thinkphp 。 访问 /robots.txt 页面 发现目录:/NSS/…

医院住院综合服务管理系统

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1 课题背景 互…

c++中超级好用的json库--json for morden c++

文章目录 json简介在线解析json的工具json for morden c简介简单使用 json简介 json是一种轻量简单的数据结构,常用于网络数据传输,相较于xml他更加简介轻量,相较于protobuf它的学习成本更低几乎看个十几分钟就能上手,因为就是一…

【J-Flash基本使用总结】

【J-Flash基本使用总结】 VX:hao541022348 ■ 烧录文件■ 创建新的工程■ 烧录模式-SWD模式■ J-Flash下载程序到单片机 ■ J-Flash拼接多个hex或bin文件■ J-Flash读单片机的option byte■ J-Flash读单片机Flash数据■ 将读出来的文件用jflash烧录到其他的芯片■ 设…

【C语言基础考研向】02 数据类型-常量-变量

文章目录: 一.数据类型 二.常量 三.变量 四. 整型数据 五.浮点型数据 六.字符型数据 七.字符串常量 一.数据类型 数据类型分为四大类: 基本类型 整型浮点字符型 构造类型 数组结构体 指针类型空类型 二.常量 常量是指在程序运行过程中,其值不发生变化的量。常量又…

Axure组件库免费下载,国内外资源都在这儿!

Axure 组件库具有高效再利用的价值。在设计中合理使用 Axure 组件库可以快速启动工作,避免重复简单的劳动,减轻设计师的负担,从而大大提高团队的生产力。在本文中,我们将分享如何下载 Axure 组件库,并附上 Axure 组件库…

SQL性能分析

SQL性能分析 1、SQL执行频率 ​ MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信 息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次: -- session 是查看当前会话 ; …

Python源码23:海龟画图turtle画小狗狗

---------------turtle源码集合--------------- Python教程43:海龟画图turtle画小樱魔法阵 Python教程42:海龟画图turtle画海绵宝宝 Python教程41:海龟画图turtle画蜡笔小新 Python教程40:使用turtle画一只杰瑞 Python教程39…

2024年第十届控制、自动化与机器人国际会议(ICCAR 2024)即将召开!

2024年4月27~29日 新加披 会议官网:10th-ICCAR 2024https://iccar.org/index.html 第十届控制、自动化和机器人国际会议将于2024年4月27-29日在新加坡举办。本次会议由新加坡电子学会,IEEE机器人和自动控制协会和IEEE联合主办,并得到北京航空…

day2·算法-快乐数-有效三角形个数

今天又来更新啦,准备蓝桥杯的小伙伴可以和我一起来刷题,建议大家先看题,整理出思路,再看如何用简单的写法将思路构建出来,然后优化细节,找到解决某些例外出现的方法,从而成功解答这道题。 快乐…