当前位置: 首页 > article >正文

枚举和联合体

1.枚举类型

1枚举类型的声明
枚举顾名思义就是一一列举。
把可能的取值一一列举。
比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一一列举
性别有:男、女、保密,也可以一一列举
月份有12个月,也可以一一列举
三原色,也是可以一一列举
这些数据的表示就可以使用枚举了。

enum Day//星期
{
	Mon,
	Tues,
	Thur,
	Fri,
	Sat,
	Sun
};
enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};

像上面的enum Day和enumSex都是枚举类型

但是枚举类型成员后面加的都是,而不是;

{}中的值是枚举可能的取值,也叫枚举常量 

枚举常量是常量是不可被修改的

这些可能的取值都是有值的,默认从0开始,依次递增1

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

enum Day//星期
{
	Mon,
	Tues,
	Thur=12,
	Fri,
	Sat,
	Sun
};

比如像这个,Mon代表0 Tues代表1 Thur代表12,Fri代表13,Sat代表14,Sun代表15

2.枚举类型的优点


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


枚举的优点:
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较枚举有类型检查,更加严谨。
3.便于调试,预处理阶段会删除#define定义的符号

(这个在后面预编译章节会学习)
4.使用方便,一次可以定义多个常量
5.枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

比如我们只想让这个枚举在函数内部使用,出了函数外就无法使用,那这个时候#define就无法实现,因为它是在预处理阶段编译前就替换掉的,是全局的

当然了,前面说过枚举是常量,也就意味着,我们在给予初始值后就不能在进行赋值了

C的编译器不严格可以通过,但是C++编译器就比较严格了,就会报错。

2.联合体

联合体类型的声明
像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。
给联合体其中一个成员赋值,其他成员的值也跟着变化。

我们直接上代码更好理解

我们可以发现,联合体成员是公用一块空间的,因此我们无法同时使用联合体的两个成员

,同时当我们改变联合体一个成员的值的同时,也有可能对另一个成员的值产生影响,当然联合体的内存大小未必是最大成员的大小

这就涉及到联合体的内存分配规则了

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

我们直接来上个例子

 这个地方联合体成员最大的是char a [6]也就是6个字节大小,但是它相当于6个char类型的变量也就是6个字节的大小,默认对齐数和char类型相同,都是1,

因此这个联合体的最大对齐数所数是int  b的4,

但是最大成员大小是char [6]大小是6个字节大小,不是最大对齐数4的整数倍,

因此要再空两个字节的空间,最后这个联合体的内存大小是8,联合体大部分时候会节省内存,但也不是绝对,有时候也会造成浪费

联合体成员一般放不会同时使用的数据,比如我要存放我早中晚吃了什么的数据,我可以把热干面和烧烤同时存到联合体里面,因为我早上不肯能吃烧烤,晚餐不可能吃热干面,不会同时用到。

3.最后再来一个题

我们前面学过了判断大小端的方了

那我们学了联合体后右有了一种新的判断大小端的方法

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
union Un
{
	char a ;
	int b;
};
int main(void)
{
	union Un un = { 0 };
	un.b = 1;
	if (un.a == 1)
	{
		printf("小端");
	}
	else
		printf("大端");
	return 0;
}

 我们先把b=1存放到联合体里面,这联合体大小是4,具体计算方法看上文

下面均是16进制表示,一个方框代表一个字节空间

大端存储

00000001

小端存储

01000000

但是当我们拿a的时候都是从 左边开始,如果拿出来的是01那就是小端存储,如果拿出来的是00

那就是大端存储。

以上就是本章全部内容。


http://www.kler.cn/news/294985.html

相关文章:

  • 在生产线打包机中RFID技术的赋能
  • Vue3.5正式发布带来了那些新特性?
  • MMO地图传送
  • 计网名词解释
  • 【qt踩坑】路径含中文导致的报错,以及 OpenGL的链接报错
  • STM32学习笔记4 --- USART
  • 实现点击 `el-dialog` 里面的一个图标将对话框放大至全屏
  • QT自动获取编译日期与git commit ID
  • 【C++11】深入理解与应用右值引用
  • python可执行文件exe
  • Openharmony 下载到rk3568实现横屏
  • 案例-上海某科技公司:监控易7.0重塑服务器监控模式
  • 简单梳理一个历史脉络
  • urllib与requests爬虫简介
  • 【Nginx系列】Nginx中rewrite模块
  • 牛客(除2!)
  • 设计模式 19 观察者模式
  • 【AIGC】AI编程工具合集及其特点介绍
  • 1-18 平滑处理——高斯滤波 opencv树莓派4B 入门系列笔记
  • 【LabVIEW学习篇 - 17】:人机交互界面设计01
  • 以后写代码都是AI自动写了,Cursor+Claude-3.5-Sonnet,Karpathy 点赞的 AI 代码神器。如何使用详细教程
  • 解决异步任务上下文丢失问题
  • 【Python】6.基础语法(6)文件
  • DataLoader使用
  • [数据集][目标检测]电动车头盔佩戴检测数据集VOC+YOLO格式4235张5类别
  • 计算机网络与Internet应用
  • OpenCV与Matplotlib:灰度图像
  • 漫谈设计模式 [20]:解释器模式
  • 实战项目-快速实战-springboot dataway
  • linux 检查cpu 内存命令