当前位置: 首页 > news >正文

【C语言】联合体枚举的讲解

d9c25ccd4d724b3493e47f53f297808c.png

目录

✨声明!!!:

联合体与结构体只有一个区别,那就是内存存储方式不同

💕1.联合体的声明

💕2.联合体内存的存储

💕3.联合体字节大小的计算

例题2:

✨4.枚举的声明

✨5.枚举类型的优点 

6.C/C++中枚举的不同 


小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化! 


✨声明!!!:

联合体与结构体只有一个区别,那就是内存存储方式不同


💕1.联合体的声明

联合体的声明与结构体的声明相同

详见的可看文章:【C语言】结构体超详细全讲解 (代码+万字文字+画图讲解)-CSDN博客

这里还是再演示一下:

union stu //联合体类型的声明,联合体类型为union stu
{char c1;int i;//联合体的内容
}b1;    //创建联合体变量b1

联合体的声明,赋值,使用,访问联合体成员等等都与结构体一模一样,这里不再多做讲解


💕2.联合体内存的存储

在联合体中也是如此,联合体中所有的联合体成员共用一块内存,并且所有联合体内容的内存起始位置都是相同的

什么叫共用同一块内存?图例如下

3772af6904ee4f729ed65c4362ccb254.jpeg

在此图中,联合体内容 c 与联合体内容 i,共用了同一块内存空间,可能还不够直观,我们再利用代码观察一下

a03a5d8f0a684538af28b76f4482b085.png

我们会发现,低位地址的内容,经过b1.c1 = 0x55执行后,i 变成了0x11223355

这就是因为联合体成员占用的是同一块内存的原因

如果我们将地址打印出来,我们会发现打印出来的地址也是一样的

cdc003f409fb48efb5583a9dd5d35b1b.png


💕3.联合体字节大小的计算

计算联合体字节的大小,要遵循以下两条规则

1.联合体的大小至少是最大成员的大小

2.当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍

例题1如下:

	union Un1 {char c[5];int i;};printf("%zd", sizeof(union Un1));//打印8

union U1 开辟了5个字节大小的内存空间,联合体成员最大对齐数为4(i),因此,联合体的字节大小要对齐到最大对齐数的整数倍,即8 

d3a1535c76a34d9799d64a53c5f63b3a.jpeg

过程与结构体字节大小计算完全一样,详见可见这里【C语言】结构体超详细全讲解 (代码+万字文字+画图讲解)-CSDN博客


例题2:

union Un2 {short c[7];int i;
};printf("%zd", sizeof(union Un2));
//打印16

union U2 开辟了14个字节大小的内存空间,联合体成员最大对齐数为4(i),因此,联合体的字节大小要对齐到最大对齐数的整数倍 ,即16

ce0b25b0c87448a9a07517778d6fdb6e.jpeg


✨4.枚举的声明

生活中的某些取值可以被一一列举出来,把这些取值抽象成一种类型,就是 枚举类型

枚举类型的声明与结构体相似,enum 是枚举类型的关键字

例如星期一,星期二,星期三到星期日这些取值可以被抽象成星期类型

枚举的声明举例:

enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};enum Color//颜⾊
{RED,GREEN,BLUE
};

需要注意:声明枚举类型的每个取值最后以逗号结尾,但是最后一个的取值不用以任何符号形式结尾

枚举类型的的取值如Mon,Tues,Wed,这些枚举常量都是有默认取值的,枚举类型的第一个常量(取值)默认是0,往下每个常量依次递增

11deea09043f4ea0ab93ce0d2445e9c0.png

枚举类型的枚举常量对应的值是可以在定义的时候进行修改的,但是不能在定义后进行修改,不然就会报错

4826954edbef4229ba0462b1377168cd.png

可以发现,在改变枚举常量后,往后的枚举常量对应的值是顺着递增的,我们可以在任意内容上对枚举常量对应的值进行修改,如图:

42e338f90b5046fca4aec57ed92ba9eb.png


✨5.枚举类型的优点 

我们可以使用 #define 定义常量,为什么非要使用枚举?

增加代码的可读性和可维护性
和#define定义的标识符比较枚举有类型检查,更加严谨
便于调试,预处理阶段会删除 #define 定义的符号
使用方便,一次可以定义多个常量
枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用


6.C/C++中枚举的不同 

在C语言中,可以将 0 赋值给enum Color 类型的 d,而在C++中却不行对比如下:

 0b749e25fab24438a9e99cbb4e330b38.png            


在C++中,如果想通过以下类型给d赋值,就会失败,因为d是枚举变量,它的类型是enum Color ,而 0 的类型是int 型,在C++中,要求的比较严格,因为类型不匹配所以不能赋值

2d7fbd18d3594b50a8aa4eb4f557108e.png

 8fdd48caf53e46a897fd8a5554dbb454.png

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 02请求响应(简单参数)
  • Java学习Day42:骑龙救!(springMVC)
  • PostMan使用变量
  • 在mac中如何使python3作为默认版本
  • v-for循环中使用‘v-model‘ directives cannot update the iteration variable itself
  • JavaSE基础——第三章 运算符
  • 如何在webots中搭建一个履带机器人
  • 什么是外贸专用路由器?
  • 微信小程序----日期时间选择器(自定义时间精确到分秒)
  • 瑞芯微rv1126 Linux 系统,修改系统时区,包有效方法
  • 8.JMeter+Ant(基于工具的实现接口自动化,命令行方式)
  • 牛客背包问题练习 xinjun与阴阳师
  • 记录一题---位示图
  • Git的基本操作
  • phpstudy 建站使用 php8版本打开 phpMyAdmin后台出现网页提示致命错误:(phpMyAdmin这是版本问题导致的)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Angular2开发踩坑系列-生产环境编译
  • C++入门教程(10):for 语句
  • centos安装java运行环境jdk+tomcat
  •  D - 粉碎叛乱F - 其他起义
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript的使用你知道几种?(上)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • VUE es6技巧写法(持续更新中~~~)
  • web标准化(下)
  • 前端临床手札——文件上传
  • 阿里云重庆大学大数据训练营落地分享
  • 移动端高清、多屏适配方案
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (AngularJS)Angular 控制器之间通信初探
  • (C语言)fread与fwrite详解
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (七)理解angular中的module和injector,即依赖注入
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)创业家杂志:UCWEB天使第一步
  • (转)人的集合论——移山之道
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 使窗口永不获得焦点
  • /run/containerd/containerd.sock connect: connection refused
  • @RequestMapping处理请求异常
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [Android]如何调试Native memory crash issue
  • [C#]winform部署yolov9的onnx模型
  • [CISCN2019 华东南赛区]Web4
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件