C语言进阶【8】--联合体和枚举(联合体和枚举这么好用,你不想了解一下吗?)
本章概述
- 联合体类型的声明
- 联合体的特点
- 联合体的大小的计算
- 枚举类型的声明
- 枚举类型的优点
- 枚举类型的使用
- 枚举类型的大小
- 彩蛋时刻!!!
联合体类型的声明
- 概述:联合体的关键字为
union
。它的结构和结构体是一样的。进行展示:
union tag
{mem_list;
}var_list;
联合体的结构,成员列表,访问方式和定义变量与结构体是一样的,在这里不再过多的陈述。但是,它俩唯一的区别就是——编译器只为联合体中最大的成员变量分配足够的空间。 也就是说,一个联合体的大小至少是最大成员变量的大小,其它所有的较小成员就和最大成员共用一个内存空间。事实如此吗?进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//联合体的声明
union Un
{char c;int i;
};
int main()
{union Un s = {0};printf("%p\n",&s);printf("%p\n", &(s.c));printf("%p\n", &(s.i));return 0;
}
结果运行图:
我们发现,联合体变量的起始地址和内部成员的地址是一样的,看来就是共用一个空间。如图所示:
这就和结构体有很大的区别。结构体的每个成员都有独立空间,但是联合体的所有成员共用一个空间。因此联合体也叫共用体。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//联合体的声明
union Un
{char c;int i;
};
int main()
{printf("%zd\n",sizeof(union Un));return 0;
}
结果运行图:
char c
占有1个字节,int i
占有4个字节。咱们在上面讲过了,编译器只为联合体中最大的成员分配足够的空间,所以这个结构体的大小就是4个字节。
联合体的特点
前面咱们讲过了,联合体中所有的成员共用一个空间。如图所示:
讲到这里,可能就有疑问了?竟然所有的成员共用一个空间,那么改其中一个成员的数据,就会导致其它成员的数据改变,事实是这样的吗?我们就以上面的代码进行调试一下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//联合体的声明
union Un
{char c;int i;
};
int main()
{union Un s = {0};s.i = 0x11223344;s.c = 0;return 0;
}
内存调试图:
事实就是如此——互相影响。所以,当我们要用联合体时,我们只能用其中一个成员(影响到其它成员时),也可以使用不止一个(不影响其它成员时)。讲到这里,可能有人就抱怨了,联合体竟然这么鸡肋,为什么还要用它呢?这就是你的格局没打开了。联合体的特点就是所有的成员共用一个空间,这不就省内存空间了吗。我们接下来举个生活中的例子,进行代码实现:
比如:我们要搞一个促销活动,促销的产品有杯子,书本和衬衫。
它们共同有的特征是:库存量和价格。
它们各自的特征: 杯子 书本 衬衫设计 作者 设计书名 大小页数 颜色
当我们想把这些商品进行展示,就要把这些特征全部包含进去。我们下意识就会想到结构体,写的代码如下:
struct git_list
{int kucun;double price;//杯子char sheji[20];//书本char zuozhe[30];char shuming[40];int yeshu;//衬衫int size;char color[10];
};
但是当我们用这个结构体创建变量的时候,比如:struct git_list book
或者 struct git_list mark
。有些特征我们是使用不到的。但是,内存也要为这些没用到的特征创建空间,这就很浪费空间了。这个时候用联合体就会节省很大的空间了,进行代码展示:
struct git_list
{//共有的特征int kucun;double price;union s0{//杯子struct s1{char sheji[20];}mark;//书本struct s2{char zuozhe[30];char shuming[40];int yeshu;}book;//衬衫struct s3{int size;char color[10];}shirt;}thing;
};
我们把共有的特征放在结构体的开头,把各自的特征(各自特征组成的小结构体)放在联合体中,这样,我们想调用那个商品的特征,就直接从联合体里面调用了(虽然联合体里面写了很多的特征,但是它们都占一个空间),相比于全部用结构体省了很多的空间。
- 练习:我们用联合体再来重温一下判断大小端字节序,进行代码展示:码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
union un
{char c;int i;
}s1;
int main()
{s1.i = 1;if (s1.c == 1)printf("小端字节");elseprintf("大端字节序");return 0;
}
结果运行图:
联合体的大小的计算
前面,咱们讲过——编译器只会给联合体中最大的成员分配足够的空间,也就是联合体的大小至少是最大成员的大小。那么,是不是就可以理解为:联合体的大小就是最大成员的大小。NO!NON!,不可以。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
union un
{char arr[5];int i;
};
int main()
{printf("%zd\n",sizeof(union un));return 0;
}
char arr[5]
占有5个字节,int i
占有4个字节,按照咱们的猜测,答案是5吗?
结果运行图:
看来我们的猜测是错误的。因为联合体的大小还有如下的规则(这才是真正的大小):
【1】:联合体的大小至少是最大成员的大小
【2】:当最大成员的大小不是对齐数的整数倍时,就要对齐到对齐数的整数倍
char arr[5] 的对齐数是 1,int i 的对齐数4,最大对齐数是 4.而最大成员 char arr[5]是5个字节,不是最大对齐数(4)的整数倍,就要对齐到8,才是最大对齐数的整数倍。
枚举类型的声明
- 概述:枚举:顾名思义就是逐个列举的意思(中文解释)。把可能的值给一一列举出来。
比如我们现实生活中:
1.一周有7天,可以一一列举出来。
2.性别:男, 女 ,保密。
3.颜色的三原色,红 ,蓝 ,绿
枚举的关键字是enum
,它的结构与结构体类似,进行代码展示:。
enum tag
{常量1, //注意:枚举里面的每一个成员后面都是' ,'结尾。常量2, 最后一个成员的结尾什么也没有......常量n
}var_list;
枚举的结构和结构体类似,但是它的成员和结构体的不同。我们知道结构体的成员都是变量,但是枚举的成员都是常量,而且这个常量还不像数字那样的常量,我们先来一代码进行展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
enum sex
{male,female,secret
};
int main()
{printf("%d\n", male);printf("%d\n", female);printf("%d\n", secret);return 0;
}
结果运行图:
大家可以看出来,枚举里面都是常量。不知道大家有没有感觉到,枚举的这个成员常量和重命名很像,进行代码展示:
#define male 0 ; // 把0重新命名为male, 也就是说:male==0
枚举的常量成员就可以类比重命名。
- 注意事项:
- 1.创建枚举时,编译器就已经为里面的常量成员分配好值了,编译器会默认给第一个成员分配0,后面的成员分配一次增1。
- 2.枚举的成员是常量,是不可以更改的。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
enum sex
{male,female,secret
};
int main()
{male = 2;return 0;
}
结果运行图:
枚举的成员时常量,所以是不可以修改的。但是,我们可以在创建枚举时进行初值的修改,进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
enum sex
{male=6,female,secret
};
int main()
{printf("%d\n", male);printf("%d\n", female);printf("%d\n", secret);return 0;
}
结果运行图:
我们可以在创建枚举时,进行修改初值。后面成员也是一次增1。
枚举类型的优点
前面,咱们讲过了,枚举定义常量和重命名是一样的,那么为什么还要用枚举呢?这就要讲到枚举的优点了。
- 枚举的优点:
- 1.增加代码的可读性和可维护性。
- 2.和#define定义的标识符比较,枚举有类型检查,更加严谨。
- 3.便于调试,预处理阶段会删除 #define 定义的符号。
- 4.使用方便,一次可以定义多个常量。(这比重命名方便多了,重命名要命很多次)
- 5.枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。
枚举类型的使用
虽然枚举的成员是常量,但是枚举也是自定义数据类型,它也可以定义变量。枚举定义变量时,赋初值只能赋值枚举类型的常量(自产自销)。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
enum sex
{male=6,female,secret
};
int main()
{enum sex peo = male;printf("%d\n",peo);return 0;
}
结果运行图:
那是否可以拿整数给枚举变量赋值呢?在C语言中是可以的,但是在C++是不行的,C++的检查比较严格。
枚举类型的大小
我们讲过每个数据类型都有大小,枚举也不例外。枚举的成员都是常量,而且都是整型常量。所以,枚举的大小就是整行int
的大小,所以为4
个字节。 直接记住:枚举的大小就是整形大小——4
个字节。结果运行图所示:
彩蛋时刻!!!
10月1日国庆快乐-毛主席语录:https://www.bilibili.com/video/BV1Lm421M7XK/?spm_id_from=333.337.search-card.all.click&vd_source=7d0d6d43e38f977d947fffdf92c1dfad
每章一句:趁年轻,总要做点什么吧!!!
感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期见!!!
相关文章:
C语言进阶【8】--联合体和枚举(联合体和枚举这么好用,你不想了解一下吗?)
本章概述 联合体类型的声明联合体的特点联合体的大小的计算枚举类型的声明枚举类型的优点枚举类型的使用枚举类型的大小彩蛋时刻!!! 联合体类型的声明 概述:联合体的关键字为 union。它的结构和结构体是一样的。进行展示…...
Android OTA升级
针对Android系统OTA升级,MTK平台有相关介绍文档:https://online.mediatek.com/apps/faq/detail?faqidFAQ27117&listSW 概念一:OTA包的构建 AOSP full build:Android原生提供的全量包的构建,意思就是可以从任何一…...
【项目经验分享】深度学习自然语言处理技术毕业设计项目案例定制
以下毕业设计是与深度学习自然语言处理(NLP)相关的毕业设计项目案例,涵盖文本分类、生成式模型、语义理解、机器翻译、对话系统、情感分析等多个领域: 实现案例截图: 基于深度学习的文本分类系统基于BERT的情感分析系…...
一觉醒来,YOLO11 冷不丁就来了
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 前言:一觉醒来,YOLO11 冷不丁就来了ultralytics 版本更新…...
智能编辑器、版本控制与自动化脚本
在繁忙的工作中,每个开发者都渴望拥有一个“秘密武器”,帮助自己提升效率、减少错误,从而更快地完成任务。那么,在众多编程工具中,哪一款能够成为你的工作效率翻倍的“秘密武器”呢?本文将探讨智能的代码编…...
jenkinsfile实现镜像构建、发布
实现代码打包编译 容器镜像构建 jenkins编译采用docker构建。 遇到问题: 1.需要限制docker 容器的内存和cpu docker { image ‘ccr.ccs.tencentyun.com/libary/maven:3.6.3-jdk-8’ args “-v ${WORKSPACE}:/workspace --memory‘2048m’ --cpus‘1’” } 2.jenkins构建需要限制…...
OSPF路由计算
关于OSPF路由的基础概述可以看看这篇博客 动态路由---OSPF协议基础https://blog.csdn.net/ZZZCY2003/article/details/141335261 区域内路由计算 LSA概述 LSA是OSPF进行路由计算的关键依据OSPF的LSU报文可以携带多种不同类型的LSA各种类型的LSA拥有相同的报文头部 重要字段解…...
【设计模式-迭代】
定义 迭代器模式(Iterator Pattern)是一种行为型设计模式,用于提供一种顺序访问集合对象元素的方式,而不暴露该对象的内部表示。通过迭代器,客户端可以在不需要了解集合实现的细节的情况下遍历集合中的元素。 UML图 …...
k8s搭建双主的mysql8集群---无坑
《k8s搭建一主三从的mysql8集群---无坑-CSDN博客》通过搭建一主三从,我们能理解到主节点只有1个,那么承担增删改主要还是主节点,如果你在从节点上去操作增删改操作,数据不会同步到其他节点。本章我们将实现多主(双主&a…...
Iterm2配置主题和Oh-My-Zsh
文章目录 一、配置主题1.1 安装使用git1.2 安装手册1.2.1 激活使用主题 二、配置oh-my-zsh2.1、oh-my-zsh插件2.2、oh-my-zsh主题 [Zsh](http://zsh.org/)2.2.1、Install using Git2.2.2、Install manually2.2.3、Activating theme2.2.4、Install using [zplug](https://github…...
html+css+js实现step进度条效果
实现效果 代码实现 HTML部分 <div class"box"><ul class"step"><li class"circle actives ">1</li><li class"circle">2</li><li class"circle">3</li><li class&quo…...
OpenCV视频I/O(8)视频采集类VideoCapture之从视频源中读取一帧图像函数read()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 抓取、解码并返回下一个视频帧。 cv::VideoCapture::read() 是 VideoCapture 类的一个成员函数,用于从视频源中读取一帧图像. 该方法…...
深度学习500问——Chapter17:模型压缩及移动端部署(2)
文章目录 17.4.6 低秩分解 17.4.7 总体压缩效果评价指标有哪些 17.4.8 几种轻量化网络结构对比 17.4.9 网络压缩未来研究方向有哪些 17.5 目前有哪些深度学习模型优化加速方法 17.5.1 模型优化加速方法 17.5.2 TensorRT加速原理 17.5.3 TensorRT如何优化重构模型 17.5.4 Tensor…...
【C#】DllImport的使用
DllImport 是 C# 中用于从非托管 DLL(动态链接库)中导入函数的一个特性。这个特性允许你在 .NET 应用程序中调用由其他语言编写的函数,如 C 或 C。使用 DllImport 可以让你重用现有的非托管代码,而不需要重新实现这些功能。 下面…...
基于 Redis 实现滑动窗口的限流
⏳ 限流场景:突发流量,恶意流量,业务本身需要 基于 Redis 实现滑动窗口的限流是一种常见且高效的做法。Redis 是一种内存数据库,具有高性能和支持原子操作的特点,非常适合用来实现限流功能。下面是一个使用 Redis 实现…...
Camera Raw:打开图像
在图像工作流程中,无论是 Raw 格式图像文件还是 JPEG、TIFF 文件,都可以先使用 Camera Raw 打开并调整后,再进入其它 Adobe 软件如 Photoshop 中进行进一步的编辑和处理。 一、打开 Raw 格式图像 1、通过 Adobe Bridge 打开 在 Adobe Bridge …...
RK3588主板PCB设计学习(六)
可以在其它层对过孔进行削盘处理, 可以看到,这里有些过孔用不上,在这一层进行了削盘处理: 对于这种电源层进行铺铜操作的时候,如果不进行削盘处理的话这些焊盘可能导致这个电源层面不完整,存在割裂的风险&a…...
论文阅读(十一):CBAM: Convolutional Block Attention Module
文章目录 IntroductionConvolutional Block Attention ModuleExperimentsConclusion 论文题目:CBAM: Convolutional Block Attention Module(CBAM:卷积注意力机制) 论文链接:点击跳转 代码链接:Git…...
【Kubernetes】常见面试题汇总(四十八)
目录 108.考虑一家拥有非常分散的系统的跨国公司,希望解决整体代码库问题。您认为公司如何解决他们的问题? 109.我们所有人都知道从单服务到微服务的转变从开发方面解决了问题,但在部署方面却增加了问题。公司如何解决部署方面的问题&#x…...
Qt Creator安卓环境配置【筑基篇】
1.前言 由于我的Qt Creator目前就先的14版本IDE老是存在各种莫名奇妙的bug,我都已经成为官方Qt Forum官方论坛的常客了。有一说一新版本的各种设置不小心误触是真的坑死人。不说了给我小主机配置安卓环境了。小主机系统版本window11-23H,Qt-Creator版本是13.01版本…...
利用SpringBoot构建高效社区医院平台
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
【C++ 前缀和 数论】1590. 使数组和能被 P 整除|2038
本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 质数、最大公约数、菲蜀定理 LeetCode 1590. 使数组和能被 P 整除 给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空)&am…...
外部引入的 JavaScript 放置位置
部引入的 JavaScript 通常有两种常见的放置位置,每个位置都有其优缺点,具体取决于页面的需求和性能优化目标: 1. 放在页面的 <head> 标签中 这种方式在 HTML 文档的 <head> 部分引入 JavaScript 文件。 <head><scrip…...
【tbNick专享】虚拟机域控、成员服务器、降级等管理
在 VMware 中完成四台域控服务器、一台成员服务器的创建、降级域控为成员服务器,并创建子域的操作。 1. 创建四台域控和一台成员服务器 1.1 在 VMware 中创建虚拟机 启动 VMware Workstation: 打开 VMware Workstation,点击 “创建新的虚拟…...
Raspberry Pi3B+之Rpanion(gst)和ffmpeg验证
Raspberry Pi3B之Rpanion-gst和ffmpeg验证 1. 源由2. 分析3. 环境搭建步骤1:安装镜像步骤2:系统更新步骤3:安装numpy组件步骤4:安装python3-picamera2组件步骤4:安装cv2组件步骤5:安装ffmpeg组件步骤6&…...
数据结构编程实践20讲(Python版)—04队列
本文目录 04 队列 QueueS1 说明S2 示例普通队列循环队列双端队列优先队列S3 问题:基于普通队列实现的打印机任务管理Python3程序S4 问题:使用循环队列管理玩家移动轨迹Python3程序S5 问题:使用双端队列来管理文档操作历史Python3程序S6 问题:使用优先队列管理车辆调度Pytho…...
Ubuntu开机进入紧急模式处理
文章目录 Ubuntu开机进入紧急模式处理一、问题描述二、解决办法参考 Ubuntu开机进入紧急模式处理 一、问题描述 Ubuntu开机不能够正常启动,自动进入紧急模式(You are in emergency mode)。具体如下所示: 二、解决办法 按CtrlD进…...
解决无网条件下离线安装缺失的python包
首先在有网的机器上使用conda create --name xx pythonx.x.x 命令创建一个和目标机器(无网)一样的环境 使用 下面命令 pip download opencv-python -d C:\Users\xuhaitao\Desktop\installer pip download pyinstaller -d C:\Users\xuhaitao\Desktop\installer 在目标…...
海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?
在当今瞬息万变的经营环境中,突出重围营销推广是每家企业都需要思考的问题。为了能突出重围并提升影响力,国内外媒体套餐内容成为了一个非常受欢迎的挑选。下面我们就为大家讲解如何运用三种不同种类的国内外媒体套餐内容来推广突出重围。 2.微博营销新浪…...
Spring DI 笔记
目录 1.什么是DI? 2.依赖注入的三种⽅式 2.1属性注⼊ 2.2构造⽅法注⼊ 2.3Setter 注⼊ 2.4三种注⼊优缺点分析 3.Autowired存在问题 1.什么是DI? DI: 依赖注⼊ 依赖注⼊是⼀个过程,是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源,⽽资源指的…...
网站套利怎么做/中国十大关键词
题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:P气瓶充装考试题考前必练!安全生产模拟考试一点通每个月更新P气瓶充装模拟考试题目及答案!多做几遍,其实通过P气瓶充装证考试很简单。 1、【多选…...
手游网站建设的宗旨/网站维护需要多长时间
2020年对华为来说,无疑是十分艰难的一年,通信设备与消费电子两大业务都受到了不小的冲击,令人担忧。但是,华为不仅挺过了2020年,还取得了一系列优异成绩,一次次证明着自己的实力。日前,华为又有…...
什么网站可以发布有偿做项目/连接友谊
iQQ 学习笔记声明本文仅供学习研究使用,不得用于任何非法及侵权用途。转贴请注明原发位置: http://xuekaiyuan.com/forum.php?modviewthread&tid6讨论请加QQ群:306320259iQQ 学习笔记3说明 :编写代码打包 Ant 脚本基于iQQ进行…...
做教育培训网站/军事最新消息
1. Group By 语句简介: Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 P.S. 这里真是体会到了一个好的命名的力量&…...
网站建设捌金手指花总三十/搜索引擎优化是什么意思
matplotlib.cm的属性,各种配色方案,用于画三维图或等高线配色 小发现: python的模块命名多用小写字母,单词的分隔用短横线实现,并不是很常用JAVA的驼峰命名 reshape()方法: xnp.array([1,2,3,4]) yx.reshape(1, x.s…...
网架公司名字大全/网络优化的工作内容
初中数学常见的一次函数,画起来还是相当方便的,在word中可以直接用直线工具及箭头工具,就可以搞定了。但是对于二次函数、反比例函数、三次函数、三角函数等曲线图形,要精确画出这些函数,word的图形功能就无能为力了。…...