欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 枚举和联合体

枚举和联合体

2024/10/24 1:51:50 来源:https://blog.csdn.net/Starry_tsx/article/details/141996386  浏览:    关键词:枚举和联合体

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("小端");}elseprintf("大端");return 0;
}

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

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

大端存储

00000001

小端存储

01000000

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

那就是大端存储。

以上就是本章全部内容。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com