【c语言进阶】自定义类型-枚举+联合(共用体)详解

目录

 1.枚举

1.1枚举类型的定义

1.2枚举常量的创建和初始赋值

2.枚举的优点

3.枚举的使用 

4. 联合(共用体)

4.1 联合类型的定义

4.2 联合体的特点

4.3联合体大小的计算 

4.4联合体的运用-判断程序的大小端存储 

5.结语


 1.枚举

枚举顾名思义就是一一列举。 把可能的取值一一列举。

比如我们现实生活中:

一周的星期一到星期日是有限的7天,可以一一列举。

性别有:男、女、保密,也可以一一列举。

月份有12个月,也可以一一列举

当我们要集体描述这些数据这里就可以使用枚举了

1.1枚举类型的定义

使用enum关键字,枚举成员之间用,隔开

enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Sex//性别
{MALE,FEMALE,SECRET
};
enum Color//颜色
{RED,GREEN,BLUE
};

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

1.2枚举常量的创建和初始赋值

enum Color
{
RED,
GREEN,
BLUE
};int main()
{
enum COlor c = GREEN;
return 0;
}

{}中的内容是枚举类型的可能取值,也叫 枚举常量 。 这些可能取值都是有值的,默认从0开始,依次递增1

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

enum Color//颜色
{RED=1,GREEN=2,BLUE=4
};

2.枚举的优点

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

枚举的优点

1. 增加代码的可读性和可维护性

2. 和#define定义的标识符比较枚举有类型检查,更加严谨。

3. 便于调试

4. 使用方便,一次可以定义多个常量

3.枚举的使用 

enum Color//颜色
{RED=1,GREEN=2,BLUE=4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;        

clr = 5;    

这样的代码在C语言这种语法检查不那么严格的可以这么书写,但是在c++这样的环境里面就会出行类型不匹配,因为枚举是有类型的是枚举类型。但是5是int 类型。如果是#define定义的类型就可以,因为没有类型

4. 联合(共用体)

联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。关键字是union.

4.1 联合类型的定义

//联合类型的声明
union Un
{char c;int i;
};
//联合变量的定义
union Un un;

当我们计算这个联合体的大小我们发现:

好像既不是对齐也不是将成员大小进行相加,那么联合体的存储是什么样的,我们看一下:

4.2 联合体的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)。

我们对上述结构体中的成员打印地址可以发现:

两个成员的地址是一样的,就是说联合体的成员共用一块空间。

所以联合体也叫作共用体,也就意味着联合体的成员在同一时间只能使用一个,改变一个,另外一个也会被改变。

4.3联合体大小的计算 

联合的大小至少是最大成员的大小。

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

分析以下代码:

union Un1
{char c[5];int i;
};
union Un2
{short c[7];int i;
};
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));

un1:

char c 是一个数组,按成员类型算,char 类型大小是1,vs环境下默认对齐数是8,所以字符数组的对齐数是1,i的对齐数是4,那么最大对齐数是4.那么第一个输出就应该是8,第二个应该是16.

4.4联合体的运用-判断程序的大小端存储 

当我们没有学过联合体的时候我们判断程序大小端的思路是定义一个整型赋值为1,将这个整型的第一个字节内容取出看是否为1,是1就是小端,不是就是大端。

当有了共用体,由于1两个成员共用一块空间,我们可以这样判断:
 

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

 

5.结语

   以上就是本期的所有内容,知识含量蛮多,大家可以配合解释和原码运行理解。创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是Nicn,正在c++方向前行的奋斗者,感谢大家的关注与喜欢。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA设计模式之建造者模式详解

建造者模式 1 建造者模式介绍 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式. 定义: 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 **建造者模式要解决的问题 ** 建造者模式可以将部件和其组装过程分开…

大数据应用对企业的价值

目录 一、大数据应用价值 1.1 大数据技术分析 1.2 原有技术场景的优化 1.2.1 数据分析优化 1.2.2 高并发数据处理 1.3 通过大数据构建新需求 1.3.1 智能推荐 1.3.2 广告系统 1.3.3 产品/流程优化 1.3.4 异常检测 1.3.5 智能管理 1.3.6 人工智能和机器学习 二、大数…

降准是什么意思?降准对股市有哪些影响?

降准是什么意思 降准,全称为“中央银行调低法定存款准备率”,是指中央银行降低法定存款准备率,以增加银行的可用资金,从而增加市场的流动性。 具体来说,存款准备金是商业银行为了应对储户取款和清算时准备的资金&…

【MySQL进阶之路】MySQL 中表空间和数据区的概念以及预读机制

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

火车可视化调车系统

列车在调车作业时,当机车头在尾部推动车厢时,司机室一人操控机车,车厢前端配备两名挂梯随车运行调车员,调车员人为分析行车方向是否有障碍、轨道行人等紧急情况,通过对讲机通知司机控制停车。由于司机无法直观观察列车…

django admin 自定义界面时丢失左侧导航 nav_sidebar

只显示了自定义模板的内容,左侧导航没有显示出来。 原因:context 漏掉了,要补上。 # 错误写法(左侧导航不显示)def changelist_view(self, request, extra_contextNone):form CsvImportForm()payload {"form&qu…

C语言指针运算

指针运算 指针加法意味着地址向上移动若干个目标指针减法意味着地址向下移动若干个目标示例: int a 100; int *p &a; // 指针 p 指向整型变量 aint *k1 p 2; // 向上移动 2 个目标(2个int型数据) int *k2 p - 3; // 向下移动 3 个…

无广告iOS获取设备UDID 简单方便快捷

ps: 为啥不用蒲公英了,就是因为有广告了,获取个UDID还安装游戏,真恶心?,所以找了新的获取UDID都方法,网页直接获取就可以,不会安装软件。 UDID 是一种 iOS 设备的特殊识别码。除序号之外&…

形态学算法之边界提取的简单python实现——图像处理

原理 图像处理中的边界提取是一项基本而重要的任务,主要用于识别和提取图像中物体的轮廓或边界。 具体流程 1.边缘检测 边界提取的第一步通常是边缘检测。边缘是图像亮度变化显著的地方,是物体与背景或不同物体间的分界线。边缘检测算法通过识别图像中…

基于高通滤波器的ECG信号滤波及心率统计matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 ECG信号简介 4.2 高通滤波器原理 4.3 心率统计 5.完整工程文件 1.课题概述 通过高通滤波器对ECG信号进行滤波,然后再统计其心率。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a…

手把手教:如何搭建UI自动化测试框架(使用篇Ⅱ)

UI自动化测试框架是有很多的。我们以pytestseleniumallurePO模式为例子给大家简要说明一下。搭建步骤有下面几步: 1、工具环境 2. 依赖包 3. 工程目录 4. 脚本书写步骤 a ) 初始化代码 b ) 一个测试用例脚本编写过程 c ) 引入数据驱动 d ) 引入日志 e ) 生成测试报…

Android用setRectToRect实现Bitmap基于Matrix矩阵scale缩放RectF动画,Kotlin(二)

Android用setRectToRect实现Bitmap基于Matrix矩阵scale缩放RectF动画,Kotlin(二) 文章 https://zhangphil.blog.csdn.net/article/details/135980821 实现了基于Matrix缩放Bitmap的动画,但是从左上角(0,0)位…