C语言结合体和枚举的魅力展现

前言

在这里插入图片描述

✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论

个人主页:秋邱’博客

所属栏目:人工智能

(感谢您的光临,您的光临蓬荜生辉)

引言:
前面我们已经讲了结构体的声明,自引用,内存对齐等,详细见《掌握C语言结构体,开启编程新世界》。有需要的可以回看。
今天我们讲的是枚举和结合体,这两个跟结构体很相像但也是还是有差别的。

1.0 联合体

//代码1
#include<stdio.h>
struct U {
	char a;
	int b;
};
int main()
{
	printf("%zd", sizeof(struct U));
	return 0;
}

//代码2
union U {
	char a;
	int b;
};
int main()
{
	printf("%zd", sizeof(union U));
	return 0;
}

打印结果:

代码1
8

代码2
4

为何这两个的打印结果不相同呢,这就是我们与结构体很相似的联合体。
顾名思义,联合体是一种特殊的数据类型,可以存储不同类型的数据,但同一时刻只能存储其中一种类型的数据。
我们先来看看结构体和联合体的区别

结构体联合体
structunion
多个成员多个成员
每个成员都有自己独立的空间所有成员共用一块内存空间

1.1 联合体声明

联合体的定义格式如下:

union 类型名 {
    成员1
    成员2
}变量;
 

联合体和结构体的声明很相似,这里我们就简单的举一个例子。

#include<stdio.h>
union U {
   char a;
   int num;
};
int main()
{
   union U p1 = { 0 };
   p1.num = 1;
   p1.a = 2;
   printf("%d",p1.num)
   return 0;
}

1.2 联合体的特点

上面两窜代码中,我们能很明显的看出,联合体联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。
我们知道了它们是用的用一块地址,具体是怎么样的我画图来给大家看看。
在这里插入图片描述
这是union在内存中的存储。

1.3 对齐数

虽然联合体的内存是是共⽤同⼀块内存空间的,但也是有最大对齐数的。
看代码

union U
{
   short a[7];
   int b;
};
int main()
{
   printf("%zd", sizeof(union U));
   return 0;
}

short类型是2个字节,但是有7个所以占了14个字节,如果你以为答案是14,那你就错了。当最大成员的大小不是最大对齐数的整数倍,就要和最大对齐数的整数倍,所以这里
打印结果:

16

1.4 联合体的使用

结合体的定义几乎和结构体一样。

⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。
每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、⻚数
杯⼦:设计
衬衫:设计、可选颜⾊、可选尺⼨

代码实现:

struct gift_list
{
	//公共属性
	int stock_num;//库存量
	double prince;//商品价格
	int item_type;//商品类型

	//特殊属性
	char title[20];//书名
	char author[20];//作者
	int num_pages;//页数
	char design[30];//设计
	int colors;//颜色
	int sizes;//尺寸
};

虽然这样的代码也是没什么问题,用起来也很方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常⽤的。
书:书名、作者、页数。
杯子:设计。
衣服:设计、颜色、尺寸。

struct gift_list
{
    int stock_number;//库存量
    double price; //定价
    int item_type;//商品类型

    union {
        struct 
        {
            char title[20];//书名
            char author[20];//作者
            int num_pages;//页数
        }book;
        struct 
        {
            char design[30];//设计
        }mug;
        struct 
        {
            char design[30];//设计
            int colors;//颜色
            int sizes;//尺寸
        }shirt;
    }item;
};

我们把公共属性用struct单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以
介绍所需的内存空间,⼀定程度上节省了内存。

1.5 一个练习

之前的练习过判断大小端了,这里我们也可以用联合体巧妙的来判断大小端。

#include<stdio.h>
int check_sys()
{
	union Un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;//小端:返回1,大端:返回0
}

int main()
{
	int ret = check_sys();//小端:返回1,大端:返回0
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

这个代码就很巧妙的运用了联合体的特点。

2.0枚举

2.1 枚举的声明

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

enum 枚举名 
{    枚举元素1,
     枚举元素2, 
     ……
};

这就是枚举的声明。
⽐如我们现实⽣活中:

—— 周的星期⼀到星期⽇是有限的7天,可以
——列举性 别有:男、⼥、保密,也可以
——列举 ⽉份有12个⽉,也可以
——列举 三原⾊,也是可以意义列举

代码实现:

enum Day//星期,枚举类型
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};
enum Sex//性别,枚举类型
{
	MALE,
	FEMALE,
	SECRET
};
enum Color//颜色,枚举类型
{
	Red,
	Green,
	Blue
};

{}中的内容是枚举类型的可能取值,也叫枚举常量
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

enum Color
{
	Red = 3,
	Green = 6,
	Blue = 8
};

2.2 枚举的优点

C语言枚举的优点包括:

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

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

  3. 便于调试,预处理阶段会删除#define 定义的符号

4.枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

  1. 使⽤⽅便,⼀次可以定义多个常量

总的来说,C语言枚举提供了一种清晰、可读性强且具有类型安全性的常量定义方式,可以使代码更易于理解和维护。

2.3枚举类型的使⽤

enum Color
{
	Red = 3,
	Green = 6,
	Blue = 8
};

enum Color cls = Green;//使⽤枚举常量给枚举变量赋值

那是否可以拿整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐
较严格。

结构体、联合体和枚举类型到这里就结束了,观众老爷们 ✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 前K个高频单词的六种解法

目录 大堆 小堆 vectorsort vectorstable_sort multimap set/multiset 与GPT的对话 1.对于比较类型中 < 运算符重载的理解 2.map有稳定性的说法吗 ​编辑 3.为什么map和set类的仿函数后面要加const来修饰*this 5.关于名词的理解 6.匿名对象对类要求 7.map和set的…

面向对象:继承

文章目录 一、什么叫继承&#xff1f;二、单继承三、多继承3.1多继承的各种情况3.1.1一般情况3.1.1特殊情况&#xff08;菱形继承&#xff09; 四、菱形继承引发的问题4.1 问题1:数据冗余4.2 问题2:二义性&#xff08;无法确定到底是访问哪个&#xff09; 五、虚拟继承解决菱形…

深度剖析鞋服品牌商品数字化管理的重要性

随着信息技术的迅猛发展与市场竞争的加剧&#xff0c;鞋服品牌商品数字化管理的重要性愈发凸显。数字化管理不仅关乎企业运营效率的提升&#xff0c;更是品牌实现差异化竞争、提升顾客体验、构建智慧零售生态的关键所在。对于鞋服品牌企业而言&#xff0c;提升商品数字化管理的…

python中raise_for_status方法的作用

文章目录 说明示例1&#xff1a;基本使用示例2&#xff1a;多种异常 说明 raise_for_status() 方法在 Python 的 requests 库中用于在发送 HTTP 请求后检查响应的状态码。如果响应的状态码表示请求未成功&#xff08;即状态码不是 2xx&#xff09;&#xff0c;则该方法会抛出一…

C/C++中重载函数取地址的方法

目录 1.现象 2.指定参数取函数地址 3.利用Qt的类QOverload 1.现象 函数重载在C/C编码中是非常常见的&#xff0c;但是我们在std::bind或std::function绑定函数地址的时候&#xff0c;直接取地址&#xff0c;程序编译就会报错&#xff0c;示例如下&#xff1a; class CFunc1…

【全套源码教程】基于SpringBoot+MyBatis框架的智慧生活商城系统的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台功能拓展 商品详情单管理 个人中心 秒杀活动 推荐系统 评论与评分系统 后台功能拓…

慢工之旅:婺源的故事

在当今这个快节奏、高竞争的时代&#xff0c;我们常常发现自己处于持续的忙碌和压力之中。然而&#xff0c;在今年春季&#xff0c;我们选择了一条不同的道路——一次团队旅行到江西婺源。这不仅是一场远离日常工作的旅行&#xff0c;而且成为了我们团队对工作、生活及寻求内心…

大话设计模式之迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个重要原则&#xff0c;其核心思想是降低耦合度、减少对象之间的依赖关系&#xff0c;从而使系统更加灵活、易于维护和扩展。 根据迪米特法则&#xff0c;一…

CSS之动画

一&#xff0c;动画的制作 实现盒子绕圈走 二&#xff0c; 动画的常用属性 三&#xff0c;动画简写属性 前面两个属性一定要写&#xff0c;第三个linear是指匀速的意思&#xff08;默认是ease&#xff09;

matplotlib中的颜色表示方法

matplotlib中的颜色表示方法 1.RGB或RGBA格式 格式示例以一个3元素或4元素的tuple来表示颜色&#xff0c;每个元素取值范围是[0,1](0.1,0.2,0.5) (0.1,0.2,0.5,0.3)大小写不敏感的16进制表示法#0F0F0F等价于#0x0f0f0f等价于(15/255,15/255,15/255)带透明度的#0f0f0f80简短的…

Qt_day4:2024/3/25

作业1&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

Java毕业设计-基于Spring Boot的在线考试系统-毕业论文+答辩ppt(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统登录注册2、管理员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于Spring Boot的在线考试系统-毕…

Linux之冯诺依曼体系,操作系统,进程的理解,进程状态,以及进程的优先级

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.冯诺依曼体系 二.操作系统 2.1概念 2.2结构示意图&…

面试产品经理,怎样描述过往经历,才能让面试官印象深刻?

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;给大家分享这篇产品经理面试干货文章&#xf…

搬运5款有趣又好用的软件

​ 如果你想让你的电脑使用更方便、更有趣、更专业&#xff0c;那么你一定要看看这篇文章&#xff0c;因为我要给你推荐五款好用又有趣的WIN10软件。 1. 文字识别——PandaOCR ​ PandaOCR是一款高效的文字识别软件&#xff0c;可快速将图片中的文字转化为可编辑的文本。其识…

2024年MathorCup数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

刚刚,璞华科技、璞华易研PLM产品荣获智能制造领域两大奖项!

刚刚&#xff0c;在e-works数字化企业网于北京举办的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”上&#xff0c;璞华科技凭借在智能制造领域的雄厚实力和产品口碑&#xff0c;荣获两大奖项。 璞华科技被评为e-works【2023年度智能制造优秀供应…

20232831 2023-2024-2 《网络攻防实践》第4次作业

目录 20232831 2023-2024-2 《网络攻防实践》第4次作业1.实验内容2.实验过程&#xff08;1&#xff09;ARP缓存欺骗攻击&#xff08;2&#xff09;ICMP重定向攻击&#xff08;3&#xff09;SYN Flood攻击&#xff08;4&#xff09;TCP RST攻击&#xff08;5&#xff09;TCP会话…

为什么你的企业需要渗透测试

渗透测试是什么&#xff1f; 渗透测试是在安全、符合规定并且受控的条件下针对公司精心策划的经过批准的网络攻击。渗透测试人员努力发现和利用组织环境的设定范围内的漏洞&#xff0c;在黑客等犯罪分子利用它们之前提前分析弱点。 渗透测试通常是安全审计的一部分&#xff0…

大规模云存储展望|2024逐步复苏,2025全面恢复

SSD以其高速度和低延迟等优点&#xff0c;尤其在容量增长和每GB成本降低方面&#xff0c;SSD的增长速度预计将超过近线硬盘&#xff08;Nearline HDD&#xff09;。尽管HDD在大容量存储方面仍有一定优势&#xff0c;但由于SSD在访问速度、能耗及体积等方面的突出表现&#xff0…