C语言——联合与枚举

news2024/12/29 11:17:38

大家好,上篇文章和大家分享了C语言中的自定义类型结构体。接下来,我们再来了解一下其他的自定义类型——联合与枚举,记得三连支持一下哦!

ebe3d837b8494cd9b8ef4127ff0ed828.jpeg

一、联合体

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

1.联合体类型的声明

联合体的声明和结构体类似。

如:

957cdaeeb750438a8e9c9776120b1779.png

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

a785226249da43da9ee3665ce8c18e7d.png90913c4f44db4ea2b89439450bf2af8b.pngf3620606b12e46d2a07b801986735b2a.png

我们可以看到,个成员赋值后,其他的成员的值也发生了改变了,这是为什么呢?这肯定和它的存储方式有关。

2.联合体的特点

为了搞清联合体的特点我们先来看看一个联合体变量的大小,会不会和结构体一样呢?

ac00597b8a8a4fde9985d6e9eff12ec9.png

我们可以看到是4个字节,只占一个整型的大小。

所以联合体的特点是:所有成员共⽤同⼀块内存空间。但是编译器只为最⼤的成员分配⾜够的内存空间。所以联合体也叫:共⽤体。

我们可以来打印一下各个成员的地址,看看是不是这样:

098e77bea46445458020328171161c60.png

我们可以看到每个成员地址都是一样的,它们确实共用一块地址。

fafd2cc88923427ab63914bdf96e96aa.png

上面这段代码我们可以看到:a的第四个字节的内容修改为55了.

8dec2b10914a4d9f9736253b28f7e908.png

3.联合体大小的计算

通过上面的观察我们可以发现,结构体比较浪费空间,而联合体是比较节省空间的。

所以联合体计算大小:

1.联合的⼤⼩⾄少是最⼤成员的⼤⼩。
2.当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

下面我们来看例子:

94c1336c97c648c191714bc3a11cea04.png

它们的大小为什么是这么多呢?

d91ae5739c8b42ee81e44989e918267f.png3bfc1146a27248caab97b08edea4a399.png

从上面我们可以看出:联合体是非常节省空间的,但也不是无节制的节省。

二、枚举

枚举也是一个自定义类型,枚举顾名思义就是⼀⼀列举,把可能的取值⼀⼀列举。

比如:一周的星期一到星期日可以列举出来;

月份有十二个月也可以列举,等等。

1.枚举类型的声明

枚举的声明也和结构体类似。如:

dc51d326c30444f9b26b6080be27fd29.png3c35c11173614770bd861f962e8a240e.png

以上定义的 enum days , enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫枚举常量 。

这些可能取值都是有值的,默认从0开始,依次递增1。如:95f1895f56b444d086e018f65c751332.png

当然在声明枚举类型的时候也可以赋初值,如:
6065c192685d4269ac4252cd61e3c368.png

通俗来讲,枚举类型和#define差不多,但是并不相同。

2.枚举类型的优点

我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?
枚举的优点:
1. 增加代码的可读性和可维护性;
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨;
3. 便于调试,预处理阶段会删除 #define 定义的符号;
4. 使⽤⽅便,⼀次可以定义多个常量;
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤。

所以说枚举还是有许多优点的。

3.枚举类型的使⽤

那么枚举该怎么使用呢?最主要的用法上面已经介绍了。1da112a4a8f84c4e99a8f7c89aaadd08.png

那是否可以拿整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
好了,以上就是本篇文章的全部内容了,感谢大家的观看,创作不易,三连支持一下吧!

812dd1a160274e53b45d2b148cd7ba71.gif

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

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

相关文章

AI预测福彩3D第9套算法实战化测试第1弹2024年4月24日第2次测试

今天继续进行新算法的测试,今天是第2次测试。好了,废话不多说了,直接上图上结果。 2024年4月24日福彩3D预测结果 6码定位方案如下: 百位:1、0、2、3、6、7 十位:2、4、1、6、0、5 个位:3、2、4、…

企业工商信息查询API接口如何对接

企业工商信息查询API接口指的是输入公司名全称/注册号/社会统一信用代码的任意一种,获得企业工商注册登记中包含的各类重要信息,主要信息包括:注册号,注册资金,登记机关,注册地址,核准时间&…

力扣HOT100 - 543. 二叉树的直径

解题思路: class Solution {int ans;//记录节点数public int diameterOfBinaryTree(TreeNode root) {ans 1;depth(root);return ans - 1;//节点数减 1 就是路径长度}public int depth(TreeNode root) {if (root null) return 0;int l depth(root.left);int r de…

ONLYOFFICE:一站式在线协作办公好选择

🛵前言 随着信息技术的迅猛发展,人们对办公方式的需求也在不断变化。传统的办公软件已经无法满足现代企业的需求,而在线协作办公软件则成为了一个热门选择。 在众多在线协作办公软件中,ONLYOFFICE凭借其强大的功能和灵活的部署方…

【电控笔记5.10】Luenberger估测器

Luenberger估测计 单积分器:pi控制器的补偿 双积分器:使用pid控制器的补偿 除了受控厂跟传感器,其他都在mcu 去掉Rs就是一个PLL锁相环 带宽比PLL更大

【大数据】LSM树,专为海量数据读写而生的数据结构

目录 1.什么是LSM树? 2.LSM树的落地实现 1.什么是LSM树? LSM树(Log-Structured Merge Tree)是一种专门针对大量写操作做了优化的数据存储结构,尤其适用于现代大规模数据处理系统,如NoSQL数据库&#xff…

ros2 node 之间的通信方式之 —— Topic通信案例

文章目录 ros2 node 之间的通信方式之 Topic通信Topic 通信案例1、创建工作空间2、创建功能包3、编写发布者和订阅者代码3.1 topic_helloworld_pub.cpp3.2 topic_helloworld_sub.cpp 4、编写CMakeLists.txt5、编译工作空间下的功能包6、运行结果 ros2 node 之间的通信方式之 To…

​「Python绘图」绘制小猪佩奇

python 绘制小猪佩奇 一、预期结果 二、核心代码 import turtle print("开始绘制小猪佩奇") pen turtle.Turtle() pen.pensize(4) #pen.hideturtle()pen.speed(1000)pen.color("#ff9bc0","pink") pen.setheading(-30) pen.pu() pen.goto(-100,…

c++ - 空间申请和释放 new/delete

文章目录 一、c/c内存分布二、new/delete 的使用三、malloc/free 和 new/delete 的对比四、new/delete 的实现原理五、匹配问题 一、c/c内存分布 求下面各个变量的位置 // c/c内存分布int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar …

Paddle 1.8 与 Paddle 2.0 API 映射表

安装2.6的paddlepaddle之后总是报fluid的错误,查询得知这个接口已经弃用了,但是一直找不到替换接口,偶然查询报错信息的时候找到了映射表,转存一下。 Paddle 1.8 与 Paddle 2.0 API 映射表

打开IIS网站网页错误提示Argument ‘Key must not be null‘ cannot be null.解决方案 Oracle数据库监听

打开网页异常如下: /“应用程序中的服务器错误。 Argument Key must not be null cannot be null.参数名:Key must not be null 客户端 连接oracle 提示:ORA-12541:TNS:无监听程序 按组合键WindowsR,打开运行 输入命令:lsnrctl s…

道一云与畅捷通T+对接集成获取报销信息列表连通凭证创建(报销差旅费(天水))

道一云与畅捷通T对接集成获取报销信息列表连通凭证创建(报销差旅费(天水)) 对接源平台:道一云 在道一云坚实的技术基础上,道一云推出全新升级的2.0产品矩阵,分别是低码平台、智能门户、场景应用。基于云原生底座,为企业…

解决DataGrip连接MySQL8时出现时区错误问题

解决办法:在url后面拼接时区参数 ?serverTimezoneAsia/Shanghai

虚拟仿真实训室+实时云渲染,便捷高效的教学新体验

一、VR虚拟仿真实训室的优势和缺点 信息技术的发展在教育方面的应用也逐渐广泛起来,一种新兴的教学手段正以其独特的魅力打破传统教育的壁垒——这就是虚拟仿真教学。一些高校中会建立vr仿真实训室来供学生进行学习。这种形式有哪些优势和缺点呢? 优势…

手撕sql面试题:计算出在校人数,字段中含有学生的学制

今天分享一道面试题!如下: 有一个录取学生人数表,记录的是每年录取学生人数和入学学生的学制 以下是表结构: CREATE TABLE admit ( id int(11) NOT NULL AUTO_INCREMENT, year int(255) DEFAULT NULL COMMENT 入学年度, num int(255) …

前端css中filter(滤镜)的使用

前端css中filter的使用 一、前言二、补充内容说明三、模糊(一)、模糊效果,源码1(二)、源码1运行效果1.视频演示2.截图演示 四、阴影(一)、阴影效果,源码2(二)…

后端-MySQL-week11 事务

事务 简介 操作 有两种方式,一种是设置为手动提交——不执行“commit”不进行变更;另一种是手动开启一个事务,用开启事务的代码(SQL语句)来创建一个需要“commit”才能进行变更的事务 1.第一种方式 2.第二种方式 四…

C++ | Leetcode C++题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){// 所有数都填完了if (first len) {res.emplace_back(output);return;}for (int i first; i &…

如何使用 Vercel 托管静态网站

今天向大家介绍 Vercel 托管静态网站的几种方式&#xff0c;不熟悉 Vercel 的伙伴可以看一下之前的文章&#xff1a;Vercel: 开发者免费的网站托管平台 Github 部署 打开 Vercel 登录界面&#xff0c;推荐使用 GitHub账号 授权登录。 来到控制台界面&#xff0c;点击 Add New …

Docker 命令 镜像操作 容器操作 备份与迁移 DockerFile

什么是Docker&#xff1f; Docker是一种开源应用容器引擎&#xff0c;开发者可以打包自己的应 用以及依赖包到可移植的容器中&#xff0c;然后发布到任何linux机器上。 Docker客居在操作系统内核上的用户空间&#xff0c;只能运行与底层宿主 机相同的操作系统之上。主要目标是…