【C语言】自定义类型——枚举、联合体

引言

对枚举、联合体进行介绍,包括枚举的声明、枚举的优点,联合体的声明、联合体的大小。

 158c3f50b199454985017a51dbef9841.png               ✨ 猪巴戒:个人主页✨

               所属专栏:《C语言进阶》

        🎈跟着猪巴戒,一起学习C语言🎈

目录

引言

枚举

枚举的优点

联合(共用体)

 联合体的内存分布

如何通过联合体检验编译器的大小端?

联合体的大小

总结:


枚举

将事物一一列举出来,每个枚举常量都有一个取值。
下面就是枚举的具体格式,Mon,Tues,Wed这些就是枚举常量,每个枚举常量之间用逗号 隔开。枚举常量用大括号括在一起,记得结尾要有分号作为结尾。
枚举中的变量都是有初始值的,默认从0开始,后面就是递增1。下图将它们各自的值打出来。
enum Day
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

181154d13d074a1aa5663c1fa71c98d6.png

枚举变量的取值也是可以直接定义的。 

enum Color//颜⾊
{
     RED=2,
     GREEN=4,
     BLUE=8
};

         

枚举的优点

通过定义宏,同样可以把各星期的取值打印出来。那枚举的优点是什么呢?

#define Mon 0
#define Tues 1
#define Wed 2
#define Thur 3
#define Fri 4
#define Sat 5
#define Sun 6

e77e0dd4e51545de9f95a1e0ce306adf.png

 枚举的优点

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨
  3. 防止命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

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

枚举变量都具有类型,转换的时候会更加严格。

enum Day d = Fri;
enum Day d = 5; //在C++的语法中会报错

3.防止命名污染(封装)

enum将各枚举变量封装起来。

4.便于调试

在#define在预处理阶段,define所定义的标识符就已经被替换了,调试所看到的代码和所写代码会有所差异。

而枚举中变量是不会替换的。

        

联合(共用体)

联合是一种特殊的自定义类型

这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间。

联合体的大小是联合体中成员的最大内存。

#include <stdio.h> 
union Un
{
	int a;
	char c;
};
int main()
{
	union Un u;
	printf("%d\n", sizeof(u));

	printf("%p\n", &u);
	printf("%p\n", &(u.a));
	printf("%p\n", &(u.c));

	return  0;
}

9f7935a6631144e9b12936c78433f045.png

         

 联合体的内存分布

联合体的成员共用同一块内存空间,因此联合体的大小至少是最大成员的大小。

联合体的特点:

1.联合体成员的地址是一样的

2.联合体的大小至少为最大成员的大小

联合体的成员内存是重叠的,因此联合体在同一时刻,只能使用一个联合体成员。

通过下面的例子,理解联合体的内存分布:

例子1:

#include <stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un = { 0 };
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x\n", un.i);
	return 0;
}

 由于是小端操作系统,数据在内存在的储存为小端字节序。

绿色表示联合体成员 i 。

3631b3825226476e987571b294bd571f.png

联合体的成员的地址是一样的,但是所占的字节不同。 

红色表示的是联合体成员 c 。

4771f171f84b44ecb59dd6872d8352f2.png

653d83f74f2c4dbdb1a835e9c8ef986e.png

         

如何通过联合体检验编译器的大小端?

一个数据 a = 0x11223344 在大小端字节序的不同排列

  小端字节序储存:

  • 把一个数据的低位字节序的内容存放在低地址处,把高位字节序的内容放在高地址处,就是小端字节序。

812bea8e79d645b69c52c8b12a475145.png

 大端字节序储存:

  • 把一个数据的高位字节序的内容存放在低地址处,把低位字节序的内容放在高地址处,就是大端字节序。

int a =0x11 22 33 44(这里用十六进制是为了表达)

459382accd64463f90bbb7c26dea0bf3.png

代码: 

#include <stdio.h>
int check_sys()
{
	union Un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

解释:

如果是小端字节序,i 在内存中是 01 00 00 00,这个时候将 c 拿出来,就是那联合体的第一个字节。如果是1,那么就是小端字节序。

e905c6db8a7e4cf0a4c2ae8150406b8d.png

 如果是大端字节序,i 在内存中是 00 00 00 01,这个时候将 c 拿出来,就是那联合体的第一个字节。如果是0,那么就是大端字节序。

be35a49cc8514aaab4012f8b493c3917.png         

联合体的大小

联合体的大小也存在对齐。

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

对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。

- VS 中默认的值为 8

- Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩

 例子1:

下面的打印结果是什么?

#include <stdio.h>
union Un
{
	char arr[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union Un));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

Un的最大成员是 i ,4个字节的大小,arr[5]的内存如下,联合体Un的大小要对齐,对齐到4的整数倍,因此联合体Un的大小为8个字节。

16f66c0ef39943baa4ce220bdacd6f2e.png

Un2的最大成员是 i, 4个字节的大小,short[7]的内存如下,联合体Un2的大小要对齐,对齐到4的整数倍,因此联合体Un2的大小为16个字节。

52ef3c2873e64986a287175847f8f36d.png

 1eee6f2a1a834830b199b633a2637e7f.png

总结:

  1. 枚举(将事物一一列举出来,每个枚举常量都有一个取值)
  2. 枚举的优点
  3. 联合体,联合体的内存分布 
  4. 联合体的大小

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

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

相关文章

Pytorch深度强化学习案例:基于Q-Learning的机器人走迷宫

目录 0 专栏介绍1 Q-Learning算法原理2 强化学习基本框架3 机器人走迷宫算法3.1 迷宫环境3.2 状态、动作和奖励3.3 Q-Learning算法实现3.4 完成训练 4 算法分析4.1 Q-Table4.2 奖励曲线 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见…

flowable工作流学习笔记

不同版本使用方式不一样&#xff0c;案例使用两个版本6.5.0及6.6.0,学习中6.5.0 版本是独立框架&#xff08;服务单独部署&#xff09;使用的&#xff0c; 6.6.0与springboot集成&#xff0c; 6.5.0版本如下&#xff1a; 下载flowable&#xff1a; https://github.com/flowa…

kubernetesr安全篇之云原生安全概述

云原生 4C 安全模型 云原生 4C 安全模型&#xff0c;是指在四个层面上考虑云原生的安全&#xff1a; Cloud&#xff08;云或基础设施层&#xff09;Cluster&#xff08;Kubernetes 集群层&#xff09;Container&#xff08;容器层&#xff09;Code&#xff08;代码层&#xf…

电商API接口接入|电商系统中的商品功能就该这么设计,稳的一批!

商品功能作为电商系统的核心功能&#xff0c;它的设计可谓是非常重要的。就算不是电商系统中&#xff0c;只要是涉及到需要交易物品的项目&#xff0c;商品功能都具有很好的参考价值。今天就以mall项目中的商品功能为例&#xff0c;来聊聊商品功能的设计与实现。 mall项目简介 …

你必须知道的低代码和低代码代表厂商!

自低代码进入中国市场以来&#xff0c;已经有不少年头。低代码&#xff08;Low-Code&#xff09;是一种软件开发方法&#xff0c;它使得开发人员能够通过图形界面、拖放组件和模型驱动的逻辑&#xff0c;快速地构建和部署应用程序&#xff0c;而无需编写大量的代码。 低代码开…

减速机振动相关标准 - 笔记

参考标准&#xff1a;国家标准|GB/T 39523-2020 减速机的振动标准与发动机不同&#xff0c;摘引&#xff1a; 原始加速度传感器波形 可以明显看到调幅波 它的驱动电机是300Hz~2000Hz范围的。这个采样时间是5秒&#xff0c;看分辨率至少1024线。可分出500条谱线。 频谱部分 …

大模型上下文扩展之YaRN解析:从RoPE、到ALiBi、位置插值、到YaRN

前言 下半年以来&#xff0c;我全力推动我司大模型项目团队的组建&#xff0c;我虽兼管整个项目团队&#xff0c;但为了并行多个项目&#xff0c;最终分成了三个项目组&#xff0c;每个项目都有一个项目负责人&#xff0c;分别为霍哥、阿荀、朝阳 在今年Q4&#xff0c;我司第…

经纬恒润AUTOSAR成功适配曦华科技国产车规级芯片

近日&#xff0c;经纬恒润AUTOSAR基础软件产品INTEWORK-EAS-CP成功适配曦华科技的蓝鲸CVM014x系列车规级MCU芯片。同时&#xff0c;经纬恒润完成了对曦华科技开发板的MCAL软件适配和工程集成&#xff0c;为曦华科技提供了全套AUTOSAR解决方案。 基于蓝鲸CVM014x适配经纬恒润AUT…

微信万能表单源码系统 自定义你的表单系统+完整代码包+安装部署教程

表单系统已经成为了网站、APP等应用中不可或缺的一部分。无论是注册、登录、反馈还是其他各种场景&#xff0c;都需要表单来收集用户信息。然而&#xff0c;传统的表单系统往往存在着一些问题&#xff0c;如功能单一、扩展性差、维护困难等。 以下是部分代码示例&#xff1a; …

ArkTS 状态管理@Prop、@Link

当父子组件之间需要数据同步的时候&#xff0c;可以使用Prop和Link装饰器。 实现的案例之中&#xff0c;代码时平铺直叙的&#xff0c;阅读性可理解性比较差。我们应改遵循组件化开发的思想。 在我们使用组件开发的时候&#xff0c;遇到数据同步问题的时候&#xff0c;State状态…

HuatuoGPT模型介绍

文章目录 HuatuoGPT 模型介绍LLM4Med&#xff08;医疗大模型&#xff09;的作用ChatGPT 存在的问题HuatuoGPT的特点ChatGPT 与真实医生的区别解决方案用于SFT阶段的混合数据基于AI反馈的RL 评估单轮问答多轮问答人工评估 HuatuoGPT 模型介绍 HuatuoGPT&#xff08;华佗GPT&…

利用台阶仪测量薄膜厚度的方法和技巧

在薄膜制备过程中&#xff0c;薄膜厚度是一个至关重要的参数&#xff0c;直接影响薄膜的性能和应用。为了准确测量薄膜厚度&#xff0c;研究者广泛使用台阶仪&#xff0c;这是一种方便、直接、准确的测量方法。本文将介绍如何利用台阶仪进行薄膜厚度测量的方法和技巧。 选择合…

JavaWeb编程语言—登录校验

一、前言&简介 前言&#xff1a;小编的上一篇文章“JavaWeb编程语言—登录功能实现”&#xff0c;介绍了如何通过Java代码实现通过接收前端传来的账号、密码信息来登录后端服务器&#xff0c;但是没有实现登录校验功能&#xff0c;这代表着用户不需要登录也能直接访问服务器…

龙迅LT6211B,HDMI1.4转LVDS,应用于AR/VR市场

产品描述 LT6211B 是一款用于 VR/ 显示应用的高性能 HDMI1.4 至 LVDS 芯片。 对于 LVDS 输出&#xff0c;LT6211B 可配置为单端口、双端口或四端口。对于2D视频流&#xff0c;同一视频流可以映射到两个单独的面板&#xff0c;对于3D视频格式&#xff0c;左侧数据可以发送到一个…

基于YOLOv8深度学习的智能小麦害虫检测识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

MYSQL中使用IN,在xml文件中怎么写?

MYSQL&#xff1a; Spring中&#xff1a; mysql中IN后边的集合&#xff0c;在后端中使用集合代替&#xff0c;其他的没有什么注意的&#xff0c;还需要了解foreach 语法即可。

ros2 学习03-开发工具vscode 插件配置

VSCode插件配置 为了便于后续ROS2的开发与调试&#xff0c;我们还可以安装一系列插件&#xff0c;无限扩展VSCode的功能。 中文语言包 Python插件 C插件 CMake插件 vscode-icons ROS插件 Msg Language Support Visual Studio IntelliCode URDF Markdown All in One VSCode支持的…

Linux服务器修改系统时间

一、修改时区 1、查看系统当前时间 date 2、删除当前时间&#xff1a; #删除当前默认时区 rm -rf /etc/localtime 3、 将当前时区修改为上海时区 #修改默认时区为上海 ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 二、修改系统时间 1、查看系统当前时间 d…

2018年第七届数学建模国际赛小美赛D题速度扼杀爱情解题全过程文档及程序

2018年第七届数学建模国际赛小美赛 D题 速度扼杀爱情 原题再现&#xff1a; 在网上约会的时代&#xff0c;有比鱼更多的浪漫选择&#xff0c;好吧&#xff0c;你知道的。例如&#xff0c;在命名恰当的网站Plenty of Fish上&#xff0c;你可以仔细查看数百或数千名潜在伴侣的档…

Web前端-HTML(简介)

文章目录 1. HTML1.1概述1.2 HTML骨架标签1.3 HTML元素标签及分类1.4 HTML标签关系 2. 代码开发工具&#xff08;书写代码&#xff09;3. 文档类型<!DOCTYPE>4. 页面语言lang5. 字符集 1. HTML 1.1概述 HTML 指的是超文本标记语言 (Hyper Text Markup Language)&#x…