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

news2024/10/6 12:30:41

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.coloradmin.cn/o/160718.html

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

相关文章

【2】成功安装部署K8s集群

目录 1、安装方式 2、环境初始化 【1】主机名解析 【2】时间同步 【3】禁用iptables和firewalld服务(三台都要设置) 【4】禁用selinux(三台都要设置) 【5】禁用swap分区 【6】修改linux的内核参数 3、安装docker 【1】安…

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

🐋自定义类型:结构体,枚举,联合🦖结构体🐔1.结构体的声明🐤1.1 结构的基础知识🐤1.2 结构的声明🐤1.3 特殊的声明🐤1.4 结构的自引用🐤1.5 结构体…

APSIM实战练习:Kingsthorpe土壤水分蒸发研究

在本练习中,您将对来自澳大利亚昆士兰州金斯索普的真实试验的数据进行建模。使用从试验中观察到的数据,您将创建一个气象文件,模拟三个蒸发曲线并将模拟输出与观察到的数据进行比较。 有关试用的更多背景信息,请参阅此 PowerPoin…

操作系统-进程与线程

进程的概念、组成、特征 概念 程序:是静态的,就是存放在磁盘里的可执行文件,如:QQ.exe。 线程:是动态的,是程序的一次执行过程,如:可同时启动多次QQ程序。 组成 进程由PCB、程序…

Java数组(复习)

Java数组 数组:数组是指一种容器,可以用来存储同种数据类型的多个值 数组容器在存储数据的时候,需要结合隐士转换考虑。例如:int类型的数组容器,可以存储byte,short,int类型的数组。double类型…

矩阵乘GPU性能优化之split k

矩阵乘计算GPU实现中通常为线程块计算一个较大的[m_tile, k] *[k, n_tile]的矩阵乘,最后分配到每个线程后同样为每个线程计算更小的一个[m_tile, k] *[k, n_tile]。 这样存在的一个问题主要是在于m和n较小而k很大时,如下图所示的矩阵乘案例,…

总结各种常见的池子

池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 池化技术的优点主要有两个:提前准备和重复利用。 像池化技术一些典型的池子就比如线程池,内存池,对象池,数据库连接池等等,线程…

cmake入门之一:编译、INSTALL及shell语句

cmake入门之一:编译、INSTALL及shell语句1.创建相应文件1.1 工程目录下CMakeLists.txt1.2 src文件夹1.2.1 src文件夹下main.c1.2.2 src文件夹下CMakeLists.txt1.3 runhello.sh1.4 其他文件/文件夹2.编译3.查看结果参考文献在学习cmake-practice这本书中的demo时&…

《基于机器学习的雷达辐射源分选与识别技术研究》论文解读

Data:2023-1-12 Ref: 李雪琼, “基于机器学习的雷达辐射源分选与识别技术研究,” PhD Thesis, 国防科技大学, 2020. 文章目录背景重频(PRI)基于已知信号的雷达分选技术基于未知信号的雷达分选技术这篇文章我主要关注他的第三、四章。第三章主要描述了基于已知信号的雷达分选技术…

《MySQL系列-InnoDB引擎15》文件-日志文件-慢查询日志

日志文件 日志文件记录了影响MySQL数据库的各种类型活动。MySQL数据库中常见的日志文件有: 错误日志(error log)二进制日志(bilog)慢查询日志(slow query log)查询日志(log) 这些日志文件可以帮助DBA对MySQL数据库的运行状态进行诊断,从而更好的进行数…

RTE 领域的发展,为视频编解码标准带来哪些新变化?丨Dev for Dev 专栏

本文为「Dev for Dev 专栏」系列内容,作者为声网资深视频算法负责人 戴伟。 01 视频编解码标准的历史和现在 1990 年左右 H.261 标准的制定,开启了视频编解码标准化的历程。经过 30 多年的努力,视频的编码效率得到了极大幅度的提升。在下图…

编程练习:找“单身狗“(三种解题法(不含暴力法))

目录 一.问题描述 二. 方法一:排序法 题解代码: 三.方法二:位运算法 第一步: 第二步: 第三步: 题解代码: 方法三:顺序表记录法 第一步: 第二步: …

c语言tips-【C语言多线程编程】

0.摘要 操作系统具有管理进程,进程调度的能力,线程,决定哪个进程、线程使用 CPU。很多时候我们需要在同一时间干不同的任务,这就需要我们通过多进程或者多线程来进行,在我们学习和工作中我们大部分用到的都是多线程,本…

SAP FICO 成本估算解析

成本估算解析 物料成本构成组件分类,比如下图中的G(Overhead)、L(Subcontracting)、E(Internal Activity)等。 同时它也分不同的视图,每个视图中包含了不同的组件。 对同一个工厂的同…

SpringEvent的使用

步骤:定义事件,继承ApplicationEvent定义监听,要么实现ApplicationListener接口,要么在方法上添加EventListener注解发布事件,调用ApplicationContext.publishEvent()或者ApplicationEventPublisher.publishEvent();1、…

附录C:Standard Parasitic Extraction Format(SPEF)

文章目录C.1 基础(Basics)C.2 格式(Format)C.3 完整语法知乎翻译圣经本附录将介绍标准寄生参数提取格式(SPEFSPEFSPEF),它是IEEEStd1481IEEE\ Std\ 1481IEEE Std 1481标准的一部分。 C.1 基础(Basics) SPEFSPEFSPEF允许以ASCIIASCIIASCII交换…

代码整洁之道,好的代码就是为了更美好的生活。

美国童子军有一条简单的军规:让营地比你来时更干净。当梳理代码时,坚守此军规:每次 review 代码,让代码比你发现它时更整洁。 一位大神说过:“衡量代码质量的唯一有效标准:WTF/min”,并配了一个…

Manjaro通过源码编译jdk11

我在编译中遇到的最大的问题就是gcc版本问题,因manjaro是滚动更新,所以gcc也是很新的版本,导致无法编译jdk11 1 下载源码 网上根据关键词查找jdk源码,查找出来很多可以下载源码的链接,这里我们使用github去官方仓库&a…

yolov5-6.0网络添加小目标检测头 TensorRT部署

小目标检测使用TPH-YOLOv5 中的yolov5l-xs-tph.yaml模型;对其中的C3STR替换为C3模块;本文的TensorRT部署是基于yolov5l-xs-tph修改后的模型训练部署,其精度一般主要学习如何TensorRT部署,都是在wang-xinyu基础上简单修改&#xff…

中科大2008年复试机试题

中科大2008年复试机试题 文章目录中科大2008年复试机试题第一题问题描述解题思路及代码第二题问题描述解题思路及代码第三题问题描述解题思路及代码第四题问题描述解题思路及代码第一题 问题描述 一个十进制正整数转换成二进制有多少个1 示例1 输入:10 输出:2解题思路及代码…