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,大端:返回0if (ret == 1)printf("小端\n");elseprintf("大端\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++的类型检查⽐
较严格。

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

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

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

相关文章

Servlet通常如何通过重写父类HttpServlet的doGet()、doPost()等方法来处理不同类型的HTTP请求?

Servlet在Java Web应用程序中用于处理HTTP请求。javax.servlet.http.HttpServlet是一个抽象类,它提供了处理HTTP请求的标准机制。当您创建一个Servlet并让它继承自HttpServlet时,您可以重写其中的doGet()和doPost()方法以便分别处理GET和POST类型的HTTP请求。 以下是Servlet…

离线Linux/openEuler服务器指定本地yum仓库

1、前提准备一个预装坏境比较完整的linux镜像文件&#xff0c;本文服务器使用的是openEuler 官网&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 2、上传镜像文件至服务器 如果是集群服务器&#xff0c;上传其中一台服务器之后&#xff0c;使用scp指令将镜…

王道C语言督学营OJ课后习题(课时14)

#include <stdio.h> #include <stdlib.h>typedef char BiElemType; typedef struct BiTNode{BiElemType c;//c 就是书籍上的 datastruct BiTNode *lchild;struct BiTNode *rchild; }BiTNode,*BiTree;//tag 结构体是辅助队列使用的 typedef struct tag{BiTree p;//树…

网络时间同步设备(时间同步系统)操作及应用方案

网络时间同步设备&#xff08;时间同步系统&#xff09;操作及应用方案 网络时间同步设备&#xff08;时间同步系统&#xff09;操作及应用方案 有不少自学成才的电脑专家还是有经过系统性训练的电脑专家&#xff0c;大部份的电脑专家都折腾过Windows Server系列的服务器操作系…

【探索Linux】—— 强大的命令行工具 P.31(守护进程)

阅读导航 引言一、守护进程简介1. 概念2. 特点 二、用C创建守护进程⭕代码✅主要步骤 温馨提示 引言 当谈到计算机系统中运行的特殊进程时&#xff0c;守护进程&#xff08;daemon&#xff09;无疑是一个备受关注的话题。作为在后台默默运行并提供各种服务的进程&#xff0c;守…

C++ —— C++11新增语法

目录 一&#xff0c;列表初始化 1.1 这是什么&#xff1f; 1.2 initializer_list 1.3 在容器的运用 1.4 STL中的变化 二&#xff0c;右值引用和左值引用 2.1 是什么&#xff1f; 2.2 这两个东西有啥关系&#xff1f; 2.3 有啥用&#xff1f; 三&#xff0c;*移动构…

基于DCT(离散余弦变换)的图像水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

如何为 Git 配置邮箱地址

在使用 Git 进行版本控制时&#xff0c;每个提交都会关联一个提交者邮箱地址。该邮箱不仅用于标识提交者身份&#xff0c;还可能与您的 Git 托管服务&#xff08;如 GitHub、GitLab&#xff09;账户关联&#xff0c;以确保提交记录正确计入您的个人贡献。本篇博客将指导您如何为…

牛角工具箱源码 轻松打造个性化在线工具箱,附带系统搭建教程

这是一款在线工具箱程序&#xff0c;您可以通过安装扩展增强她的功能 通过插件模板的功能&#xff0c;您也可以把她当做网页导航来使用~ &#x1f38a; 环境要求 PHP > 7.2.5 MySQL > 5.7 fileinfo扩展 使用Redis缓存需安装Redis扩展 去除禁用函数proc_open、putenv、s…

C语言-写一个简单的Web服务器(四)

经过以上几次的构建&#xff0c;我们基本上已经构建出来了一个简易的Web服务器&#xff0c;接下来将使用查询从文本中查询我们的问题。 查询结果 在这里我设置了一个page全局参数用来记录是哪个页面&#xff0c;避免和登录页面进行冲突重复查询&#xff08;大家可以自行优化&am…

YOLOv9改进策略 :blcok优化 | 极简的神经网络VanillaBlock 实现涨点 |华为诺亚 VanillaNet

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; VanillaNet&#xff0c;是一种设计优雅的神经网络架构&#xff0c; 通过避免高深度、shortcuts和自注意力等复杂操作&#xff0c;VanillaNet 简洁明了但功能强大。 &#x1f4a1;&#x1f4a1;&#x1f4a1;引…

303.【华为OD机试】报数游戏(约瑟夫环算法解题—JavaPythonC++JS实现)

本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解代码C/C++题解代码JS题解代码四.代码讲解(Ja…

c语音函数大全(W开头)

c语音函数大全(W开头) There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave quickly. 函数名…

二、CentOS基础配置(1.网络与包管理)

文章目录 二、基础配置操作1、网络管理&#xff08;配置静态地址并进行ssh远程连接&#xff09;&#xff08;1.&#xff09;静态地址配置&#xff08;2.&#xff09;IP配置注释&#xff08;3.&#xff09;配置SSH远程连接 2、包管理&#xff08;1.&#xff09;yum软件包管理器1…

Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT是非常实用并且相当厉害的个人知识库AI项目&#xff0c;项目是非常…

Python:文档注释、类型标注和注释宏# type:

目录 1、增加文档注释2、增加类型标注3、增加注释宏 看一段简单的代码 def add(x, y):return x y如下代码调用函数&#xff0c;可以正常执行 print(add(1, 2)) # 3 print(add(1, 2)) # 121、增加文档注释 def add(x, y):"""sum x and y:param x: int:param y…

DVWA-CSRF通关教程-完结

DVWA-CSRF通关教程-完结 文章目录 DVWA-CSRF通关教程-完结Low页面使用源码分析漏洞利用 Medium源码分析漏洞利用 High源码分析漏洞利用 impossible源码分析 Low 页面使用 当前页面上&#xff0c;是一个修改admin密码的页面&#xff0c;只需要输入新密码和重复新密码&#xff…

怎么学习写代码?

学习编写代码是一项既有挑战性又充满乐趣的任务&#xff0c;它可以帮助你创建各种应用程序、网站、游戏&#xff0c;甚至解决复杂问题。以下是一份详细的步骤指南&#xff0c;帮助你开始学习写代码&#xff1a; 1. 确定学习目标&#xff1a; - 明确你希望通过学习编程实现什…

git 合并当前分支到 指定仓库的指定分支

要将当前分支的更改合并到指定仓库的指定分支&#xff0c;可以按照以下步骤进行&#xff1a; 确保当前分支的更改已经提交并推送到当前仓库中。 添加目标仓库的远程地址。假设目标仓库的远程地址是 https://github.com/example/target-repo.git&#xff0c;你可以使用以下命令…

github项目名称变更sourcetree如何同步

github项目名称变更sourcetree如何同步 方法1:删除本地仓库 重新从URL克隆 方法2:修改远程地址链接 1.打开项目所在文件夹的终端 2.删除本地关联的这个远程仓库origin git remote rm origin 3.关联修改名字后的远程仓库地址 git remote add origin <新的远程仓库地址&…