自定义类型:结构体,枚举,联合(3)

news/2024/12/2 20:55:07/

TIPS

1. c565e1f079d4412e8b4acadffb521fc4.png

2. 

696d613bdc904a7d9428a732f4ed89db.png

枚举

1. 枚举顾名思义就是一一列举可能的取值,比如一周的星期一到星球天是有限的七天,可以一一列举。有比如性别,月份。
2. 像这种容易并且可以被一一列举的数据我们就可以定义为枚举类型。 

枚举类型 

1. 枚举的关键字为enum 

2. 枚举类型是一种自定义类型,说白了也就是一种数据类型,枚举类型是一种类型,是你自己创造出来的一种类型。

enum Day
{Mon,Tue,Wed,Thus,Fri,Sat,Sun
};
enum Sex
{male,female,secret
};
enum color
{Red,Blue,Yellow,Green,White
};

3, 注意: enum Day, enum Sex, enum color 这些就是枚举类型的名字,是数据类型。就好比int, float, double, struct Peo,......与这些地位一样。

4. {}里面的不是结构体成员,也不是什么枚举的成员......而是该枚举类型的可能取值,也称为枚举常量

枚举常量 = 枚举类型的可能取值   (背负着特殊意义的数字)

1. {}里面的都是枚举类型的可能取值,这些值都是一些不可被改变的量,所以叫常量;又是因为是枚举类型的可能取值,又叫做枚举常量

2. 如 Mon ,Tue, male, Red, Blue......这些都是枚举常量

3.  也正是因为枚举常量本质上就是一个常量,所以可以再代码语句中直接这么单独使用,比如说我打印一下

069281fdd573486e8e895e98b8cdae1e.png

4.  在定义枚举类型的时候可以自己对枚举常量给一个初始值,一旦给了之后由于其是常量,不能修改了的
4. 这些枚举常量都是有值的,默认从0开始一次递增1。当然,在定义枚举类型的时候也可以赋初值,以后如果不再次赋值的话都是递增1

63c1fe0ddb784ae4bf6d6f67332b8de8.png

252a7c2eee4440d9a64a1b63be3dfe64.png

c6dff515aa27400f96d0450838dd2f6d.png

枚举(类型的)变量     (背负着特殊意义的数字)

1. 有了类型名称之后,就也可以去通过枚举类型去定义枚举变量了。  

2.  枚举类型的变量创建好之后,可以对其进行赋值,等号右边就是枚举常量

enum Sex
{male,female,secret
};
int main()
{enum Sex a = male;enum Sex b = female;enum Sex c = secret;
}

 如: a, b, c 都是枚举变量

3. 枚举类型的变量在赋值的时候不能  enum Sex a = 0  (虽然本质上male就是常量0)。这样子因为左边类型是枚举类型,右边是整型,不匹配。 

4. 只能用枚举常量枚举变量等号右边赋值,因为这样子等号两边不会产生类型差异与冲突  

a16e228ecac04534abc85ffb865d2bce.png

枚举的好处 

1.  创建枚举类型与枚举常量,将数字与意义一一对应,使得代码可读性更高。

2.  和#define定义的标识符比较枚举有类型检查,更加严谨。
3.  防止了命名污染(封装)
4.  便于调试
5.  使用方便,一次可以定义多个常量 

补充: (关于#define 定义常量)

1. #define 定义常量的工作原理其实就是在代码里面去无脑替换 

2. 没有类型检查,对于#define定义的东西不能够调试,就是在代码里面无脑替换 

3. 真正运行起来的代码与你肉眼看到的代码是由区别的(直接将#define 定义的常量直接替换掉就是了) 

4.  为什么对于#define定义的东西不能够调试因为调试的时候这些东西老早就不存在了,都被替换掉了, 如 #define MAX 10  ,这个MAX早就在代码里面被10 替代掉了,去世了

关于枚举的注意点1 (关于类型的问题)

5324d616dca84a00baf27047b8cc31a6.png

fc8a160fabcf41e8b6b45c70c158bc20.png

26265a6d5cdc43f39df8089c5346a840.png

所以枚举常量的类型枚举类型枚举变量的类型也是枚举类型 

枚举类型是一种自定义类型,也是数据类型的一员 

关于枚举的注意点2 (关于大小的问题)

000e9550efc6427ca079a35f48f14291.png

枚举变量的大小=枚举常量的大小=枚举类型的大小=一个整型=4个字节 

 (枚举变量里面放着枚举常量)  (枚举常量的类型就是枚举类型


联合体(共用体) 

联合体的创建与联合体成员的访问与联合体变量的创建与初始化都是与结构体高度雷同 

联合体成员也是"五脏俱全" 的

1. 联合体的关键字是union  

2. 联合也是一种特殊的自定义类型。
3. 这种自定义类型里面也包含一系列的联合体成员,特征是这些联合体成员公用同一块空间。所以联合也叫共用体
4. 虽然联合体里面的各成员是在共用着同一块空间的,但是比如说c在用的时候其他的成员不能用,i在用的时候其他的成员也不能用。它们之间不可能同时使用
5. 与我们之前学的结构体不同,它的话每个成员都有自己的独立空间,互不干涉,这儿大家共用同一块空间,很是奇葩。

6. 可以把结构体想象成90年代的苏联,把联合体想象成1917年的苏俄

联合体的大小计算 (也存在一定程度的对齐)

1. 找出最大成员的大小所有成员的最大对齐数 

2. 成员为数组的话,该成员的大小就是数组每个元素大小之和,如成员int arr[10]; 那么这个arr成员的大小就是40字节。
3. 对于数组成员算对齐数的话之前有讲过
4. 联合体大小至少为最大成员的大小最大成员的大小不是所有成员最大对齐数的整数倍的时候,就要对齐到(所占字节个数为)最大对齐数的整数倍处 

5. 一个联合体变量的大小,就不是把大家加起来那么简单(因为有共用现象的存在),而是至少是最大成员的大小,因为联合体至少得有能力保存最大的那个成员。 

b539615e5bb84fc1ad37e45ee33ae8fb.png

联合体在内存中的存放 

1. 联合体其实也没有什么高级的,从内存底层视角去看待

2.  4d531880f5d748cf8efb9cd164dd50b1.png

a4eb97071c2e462f94d07f92c4678823.png

3.  22614c4856a14afb83e3408cf4c2e92c.jpeg

4. 共用同一块内存空间也意味着如果这次我成员a操作改变了里面的数据,会对我以后其他成员产生永久性的影响 

联合体应用(判断大小端字节序存储) 

union Elon
{char c;int i;
};
int check_sys()
{union Elon a;a.i = 1;return a.c;
}
int main()
{if (check_sys()){printf("小端\n");}else{printf("大端\n");}
}

附:7458879b6e8a451db31e0a6f0da81c24.jpeg

abca3867acdc42bd9a2fc7f02f99a283.png

大小端的影响

ffc214ad9efa4f36b3756b2c4f0d3e44.png


http://www.ppmy.cn/news/11885.html

相关文章

【Git】GitHub 操作

6、GitHub 操作 GitHub 网址:https://github.com/ Ps:全球最大同性交友网站,技术宅男的天堂,新世界的大门,你还在等什么? 账号姓名验证邮箱atguiguyueyue岳不群atguiguyueyuealiyun.comatguigulinghuchong令狐冲atguigulinghu…

JavaScript 数据处理 · 基本统计(文末附视频)

第 5 节 基本数据处理 基本统计 学习了如何对 JavaScript 中的数组数据进行操作之后,我们就要回到刚开始选择购买这本小册的目的了:使用 JavaScript 开发灵活的数据应用。既然说是数据应用,那么便离不开统计计算,而数组就可以说…

基于springboot,vue二手交易平台

开发工具:IDEA服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7系统用户前台和管理后台两部分,项目采用前后端分离前端技术:vue elementUI服务端技术:springbootmybatis项目功…

SpringBoot实践(三十九):如何使用AOP

目录 直接使用Aspect 定义切面逻辑 模拟业务代码 测试输出 自定义注解方式 自定义切面注解 定义切入点逻辑 模拟业务代码 测试输出 面向切面(AOP) 是spring重要特性,在功能上切面编程是面向对象编程的很好的补充,面向对象强调封装和开…

04_FreeRTOS任务挂起和恢复函数

目录 任务的挂起与恢复的API函数 任务挂起函数介绍 任务恢复函数介绍 中断中恢复函数 vTaskSuspend()任务挂起函数 vTaskResume()任务中恢复函数 xTaskResumeFromISR()中断中恢复函数 任务的挂起与恢复的API函数 挂起:挂起任务类似暂停,可恢复;删除任务,无法恢复,类似“…

敏捷是知与行的功夫

敏捷不是“一”种方法 “敏捷是一种用于项目管理和软件开发的迭代方法,可帮助团队更快地向客户交付价值并减少风险。 它不是将一切都押在“大爆炸”发布上,而是以小的增量交付成果。 不断评估需求、计划和结果,因此能够快速地响应变化。” 以…

大数据必学Java基础(一百二十):Maven工程的介绍与创建

文章目录 Maven工程的介绍与创建 一、Maven工程类型 1、POM工程 2、JAR工程 3、WAR工程

【自定义类型】-结构体,枚举,联合

🎇作者:小树苗渴望变成参天大树 💖作者宣言:认真写好每一篇博客 🧨作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 🎊自定义类型🎉前言&a…