【C语言进阶】怎么可能不会?十分钟带你玩转枚举与联合

news2024/12/24 21:43:29

目录

🍊前言🍊:

🥝一、枚举🥝:

        1.枚举类型的定义:

        2.枚举类型的优点:

        3.枚举类型的使用:

🍓二、联合(共用体)🍓:

        1.联合类型的定义:

        2.联合类型的特点:

        3.联合类型大小的计算:

🍋总结🍋:


🛰️博客主页:✈️銮同学的干货分享基地

🛰️欢迎关注:👍点赞🙌收藏✍️留言

🛰️系列专栏:💐【进阶】C语言学习

        家人们更新不易,你们的👍点赞👍和👉关注👈真的对我真重要,各位路过的友友麻烦多多点赞关注,欢迎你们的私信提问,感谢你们的转发!

        关注我,关注我,关注我,你们将会看到更多的优质内容!!


🏡🏡本文重点 🏡🏡:

🚅  枚举  🚃  联合(共用体)🚏🚏

🍊前言🍊:

        前面两节课我们完整的学完了结构体的相关知识点,而在我们的自定义类型中还有另外两个有趣又实用的成员——枚举与联合。通过灵活合理的使用它们就能使它们变成我们学习与工作中的好帮手,而本文就将带领大家在最短的时间内学会这两个好帮手的相关知识。

🥝一、枚举🥝:

        枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。是一个被命名的整型常数的集合。简单来说就将某种特定类型的对象一一进行列举一一列举特定类型可能的取值

        比如在我们的日常生活中,就有很多这样的例子:

一年总共12个月:1~12 月可以一一列举

有两种不同的性别:男生和女生可以一一列举;

总共有26个字母:a~z 可以一一列举;

诸如此类……

        生活中还有很多这样可以将可能值进行一一列举的例子,而这些例子就可以通过使用枚举类型进行表示

        枚举的声明与结构和联合相似, 其形式为:

enum 枚举名{

标识符(=整型常数)

标识符(=整型常数)

...

标识符(=整型常数)

} 枚举变量;

        1.枚举类型的定义:

        枚举类型的定义形式如下:

#include<stdio.h>

//枚举类型1:
enum Sex
{
	MALE,
	FEMALE,
	SECRET
}s1 = MALE;
//声明时进行定义与初始化(全局)

enum Sex s2 = FEMALE;
//声明时进行定义与初始化(全局)

//枚举类型2:
enum Day
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

int main()
{
	enum Day s3 = Mon;
	//定义与初始化(局部)

	return 0;
}

        我们可以看到,枚举类型的声明、定义与初始化与结构十分类似。然后我们再来看一看枚举类型内部各成员的值,我们以日期为例:

#include<stdio.h>

enum Day
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

int main()
{
    //打印各成员的值:
	printf("The value of Mon  is %d\n", Mon);
	printf("The value of Tues is %d\n", Tues);
	printf("The value of Wed  is %d\n", Wed);
	printf("The value of Thur is %d\n", Thur);
	printf("The value of Fri  is %d\n", Fri);
	printf("The value of Sat  is %d\n", Sat);
	printf("The value of Sun  is %d\n", Sun);

	return 0;
}

        将上面这个示例编译运行起来看看结果的反馈

        我们看到,枚举类型内部各成员的默认值是从 0 开始依次递增的

        但是成员的值不仅限于默认值,同时也允许我们在定义时给各成员附合适的初值:

#include<stdio.h>

enum Day
{
	Mon,
	Tues=5,
	Wed,
	Thur,
	Fri,
	Sat=15,
	Sun
};

int main()
{
	printf("The value of Mon  is %d\n", Mon);
	printf("The value of Tues is %d\n", Tues);
	printf("The value of Wed  is %d\n", Wed);
	printf("The value of Thur is %d\n", Thur);
	printf("The value of Fri  is %d\n", Fri);
	printf("The value of Sat  is %d\n", Sat);
	printf("The value of Sun  is %d\n", Sun);

	return 0;
}

        我们可以依照上面这种方式对枚举类型成员的初值进行修改:

        我们看到,经过修改本应按序赋值为 1 的枚举成员 Tues 被赋值成了 5 ,于是接下来的成员就从 5 开始依次赋值,直到成员 Sat 被赋值为 15 后接下来的成员就从 15 开始依次递增

        2.枚举类型的优点:

        于是这里就产生了一个问题,枚举类型的成员均为常量,不可在使用中被修改,那么我们同样可使用宏  #define  去定义常量,为什么非要使用枚举类型呢?

        这是因为,相比于宏,枚举类型具有很多优点

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

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

3. 防止了命名污染(通过封装实现)

4. 便于调试

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

        3.枚举类型的使用:

        同时我们要注意,在使用枚举类型时只能用枚举常量给枚举变量赋值,只有这样才不会出现类型差异:

#include<stdio.h>

//声明枚举类型
enum TEST
{
	test1,
	test2,
	test3
};
//其中test1、test2、test3为枚举常量

int main()
{
	//定义枚举变量:
	enum TEST t;

	//使用枚举常量给枚举变量赋值:
	t = test3;

	//验证赋值结果:
	printf("The value of t is %d\n", t);

	return 0;
}

🍓二、联合(共用体)🍓:

        在进行某些算法的编程的时候,需要将几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术使几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作 “ 联合体 ” 类型结构,简称联合,也叫共用体

        1.联合类型的定义:

        联合是一种特殊的自定义类型,这种类型定义的变量也包含有一系列的成员,但不同的是这些成员共用同一块空间(遂也被称作共用体)

        它的定义也基本与结构体一致

#include<stdio.h>

union TEST
{
	char a;
	int b;
}test;
//在定义联合体的同时定义联合体变量test

int main()
{
	//查看联合体的占用空间:
	printf("The size of test is %d\n", sizeof(test));

	//查看联合体成员的存储地址:
    printf("The address of test is %p\n", &test);
	printf("The address of   a  is %p\n", &test.a);
	printf("The address of   b  is %p\n", &test.b);

	return 0;
}

        但不同的是,我们编译运行后发现,联合体成员 char 类型变量 a 与 int 类型变量 b 共同占用同一片空间(一个 int 类型所占的空间)

        这种方式定义的联合体结构,是三种结构中最节省空间的一种,但同时,极致的空间节省能力导致了它在使用时需要满足的条件极为苛刻

        2.联合类型的特点:

        联合体最大的特点就是,联合体的成员是共用同一块内存空间的,则联合至少得有足够的空间容纳最大的成员,这样一个联合变量的大小就至少得是最大成员的大小

        于是,我们可以想一想,既然联合体的大小会随着内部成员大小的变化而变化,那么是不是联合体类型也可以通过判断内容大小,来帮助我们判断机器的大小端存储模式呢?

        我们直接开始实践

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int check_sys()
{
	union CHECK
	{
		char check1;
		int check2;
	}check;
	check.check2 = 1;
	return check.check1;
}

int main()
{
	if (1 == check_sys())
	{
		printf("您的机器采用小端存储模式!\n");
	}
	else
	{
		printf("您的机器采用大端存储模式!\n");
	}
	return 0;
}

        我们将其编译运行发现,该思路可以帮助我们检查机器的大小端存储模式

        3.联合类型大小的计算:

        联合体类型的大小计算需要按照以下规则进行计算

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

★ 最大成员大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍

        例如:

#include<stdio.h>

//联合体1:
union TEST1
{
	char c[5];
	int i;
};

//联合体2:
union TEST2
{
	short c[7];
	int i;
};

int main()
{
	//检查联合体的大小:
	printf("The size of TEST1 is %d\n", sizeof(union TEST1));
	printf("The size of TEST2 is %d\n", sizeof(union TEST2));

	return 0;
}

        在联合体 TEST1 中,占用空间最大的成员是 char 类型数组 c ,且其中含有 5 个元素,则其所占空间大小为 5 个字节,而我们都知道 VS 的对齐数默认为 8 ,则将会对齐至默认对齐数的整数倍,即 8 个字节;而联合体 TEST2 中,占用空间最大的成员是 short 类型数组 c ,且其中含有 7 个元素,则其所占空间的大小为 14 个字节,那么就将会对齐至对齐数的整数倍,即 16 个字节

🍋总结🍋:

        今天我们学完了枚举类型与联合类型的相关知识,学会了如何使用这两个好帮手,同时到这里我们关于自定义类型的学习也就全部结束啦!自定义类型在我们未来的工作中将会频繁的使用到。所以各位小伙伴们对于自定义类型的使用一定要烂熟于心,下去以后一定要多加练习,牢固掌握

        🔥🔥年轻不是你玩的理由,而是你奋斗的资本!!!🔥🔥

        更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~  你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

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

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

相关文章

【实验报告NO.000002】MIT 6.858 Computer System Security - Lab 3

0x03.Lab 3: Symbolic execution 本 lab 将教大家使用 符号执行 &#xff08;symbolic execution&#xff09; 这一强大的技术来寻找软件中的漏洞&#xff0c;在 lab 的最后我们将建立一个可以在 zoobar web 应用中寻找触发多种漏洞的符号执行系统&#xff08;准确的说是一个混…

基于主从博弈的电热综合能源系统动态定价与能量管理附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

你真的了解缓存吗?(2)

在上一篇文章你真的了解缓存吗?(1)中&#xff0c;我介绍了引入缓存的利与弊&#xff0c;以及在选择一款缓存中间件时应该注意什么。在这一篇文章中&#xff0c;我们继续介绍在不同的业务场景下&#xff0c;如何进行缓存的选择&#xff0c;具体来说就是缓存的分类&#xff0c;和…

嵌入式分享合集123

一、简易大功率变压器电路图 本文介绍的电子变压器克服了传统硅钢片变压器体积、重量大、效率低、价格高的缺点&#xff0c;电路成熟&#xff0c;性能稳定。 本电子变压器工作原理与开关电源相似&#xff0c;电路原理图见图1&#xff0c;由VD1-VD4将市电整流为直流&#xff0c…

书店管理系统(基于MySQL存储)

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

对标测评YD云电脑和天翼云电脑公众版

最近听说YD也推出了自研云电脑产品&#xff0c;抱着吃瓜心态网上充值体验了一把YD云电脑&#xff0c;正好我手上有天翼云电脑&#xff0c;凑一对测试看看两家央企在云计算领域的技术实力究竟如何。 测试环境搭建在我的个人pc上&#xff0c;分别下载YD云和天翼云电脑最新Windows…

[思维模式-3]:《如何系统思考》-3- 认识篇 - 什么是系统?系统的特征?

目录 第1章 什么是系统 1.1 万事万物都是一个有机的系统 1.2 系统的科学定义 1.3 系统的构成 1.4 系统的分类 第2章 动态复杂系统的八大特征 2.1 目的性 2.8 边界 2.3 结构影响行为 2.4 总体大于部分之和 2.5 因果互动 2.6 反馈 2.7 动态稳定性&#xff08;动态自…

SAP ABAP 小工具 获取两个日期时间秒数和输出时间转换文本

SAP ABAP 小工具 获取两个日期时间秒数和输出时间转换文本 引言&#xff1a; 小工具 获取两个日期时间秒数和输出时间转换文本&#xff0c;用于加强用户交互直观性。 关键字&#xff1a;SAP ABAP 日期时间间隔 秒数 转换时间文本 文章目录SAP ABAP 小工具 获取两个日期时间秒…

[附源码]Python计算机毕业设计Django吾悦商城管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

计算机毕业设计springboot+vue基本微信小程序的小区防疫监管系统

项目介绍 编写工具用idea 、Maven包,后端数据库是mysql,Java语言,springboot框架。其间,在健康打卡位置和物资选购要调用接口才可实现其功能。 1、研究对象&#xff1a;小区居民普通用户和小区管理员 管理员权限&#xff1a;管理员是整个系统的操作者,系统的各个模块都能进行信…

python中pandas进行数据分析与可视化(3)

1.创建数据源 在前几篇博客中&#xff0c;都是手动创建少量数据充当数据源&#xff0c;这次通过随机生成&#xff0c;让数据量多一些 # 导入所有需要的库 import pandas as pd import numpy.random as np import openpyxl import xlrd import matplotlib.pyplot as plt#创建一…

Python基础 - 本地模块的绝对导入/引用

目录 1. 项目入口文件 2. 绝对导入 Python本地模块的引入是比较简单的&#xff0c;包括绝对引用和相对引用(相对引用的博客参考下一篇Python基础 - 本地模块的相对导入/引用)&#xff0c;个人比较推荐使用绝对引用&#xff0c;会避免掉很多错误&#xff0c;本篇文章主要介绍绝…

【Javassist】快速入门系列01 使用Javassist实现Hello World

系列文章目录 01 使用Javassist实现Hello World 文章目录系列文章目录前言引入Javassist jar包使用Javassist实现Hello World总结说明前言 本篇文章为Javassist入门系列文章&#xff0c;适合了解Java基础语法的人零基础学会使用Javassist实现一个Hello World程序。 引入Javas…

国企招聘: 中国雄安集团2023校园招聘,面向全国,不限户籍

中国雄安集团有限公司2023年校园招聘公告 中国雄安集团有限公司&#xff08;以下简称“中国雄安集团”&#xff09;成立于2017年7月18日&#xff0c;是雄安新区开发建设的主要载体和运作平台。结合雄安新区建设需要&#xff0c;中国雄安集团布局金融与投资、城市发展与城市资源…

高低电平报警器-(模电、数电电子课程设计,毕业设计)Multisim仿真图

目录1 背景与意义1.1 研究背景1.2 研究内容1.3 技术指标2 电路设计2.1 各单元电路设计2.1.1 步进电源电路设计2.1.2 比较电路设计2.1.3 报警电路设计2.2 总体电路设计3 Multisim电路仿真与调试3.1仿真过程3.1.1 步进电源仿真调试3.1.2 总体电路仿真与调试3.2仿真结果分析4 总结…

Java项目:SSM婚纱影楼摄影商城项目网站

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录…

R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

R语言 R语言学习笔记——高级篇&#xff1a;第十四章-主成分分析和因子分析 文章目录R语言前言一、R中的主成分和因子分析二、主成分分析2.1、判断主成分的个数2.2、提取主成分2.3、主成分旋转2.4、获取主成分得分三、探索性因子分析3.1、判断需提取的公共因子数3.2、提取公共…

uboot启动流程

目录 1. 从汇编到C语言 1. 从汇编到C语言 uboot整个程序的入口是 ./arch/arm/lib/vectors.S 的 start 其中&#xff0c;reset 来自于 ./arch/arm/cpu/armv7/start.S&#xff0c; ./arch/arm/cpu/armv7/start.S 程序的执行路径为 reset --> save_boot_params_ret --> cp…

【C语言数据结构(基础版)】第四站:栈和队列

目录 一.栈的表示和实现 1.栈的概念及结构 2.栈的实现 二、栈的实现 1.栈的声明和定义 2.栈的初始化 3.栈的销毁 4.入栈 5.出栈 6.返回栈顶元素 7.返回栈的元素个数 8.栈是否为空 9.测试 三、栈的完整代码 四、队列的表示和实现 1.队列的概念和结构 2.队列的实现…

光环:工业互联网探索及案例——杨宝刚

摘要&#xff1a;文章内容主要来源于光环国际2022年第三届中国科创者大会杨宝刚老师的分享&#xff0c;原分享名称为"工业互联网助力企业数智化转型"。讲述了工业互联网概念及用友锅炉的一个实例运用。业互联网是一个整合平台&#xff0c;把你的需求告诉平台&#xf…