大家好,上篇文章和大家分享了C语言中的自定义类型结构体。接下来,我们再来了解一下其他的自定义类型——联合与枚举,记得三连支持一下哦!
一、联合体
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
1.联合体类型的声明
联合体的声明和结构体类似。
如:
但是给联合体其中⼀个成员赋值,其他成员的值也跟着变化。
我们可以看到,个成员赋值后,其他的成员的值也发生了改变了,这是为什么呢?这肯定和它的存储方式有关。
2.联合体的特点
为了搞清联合体的特点我们先来看看一个联合体变量的大小,会不会和结构体一样呢?
我们可以看到是4个字节,只占一个整型的大小。
所以联合体的特点是:所有成员共⽤同⼀块内存空间。但是编译器只为最⼤的成员分配⾜够的内存空间。所以联合体也叫:共⽤体。
我们可以来打印一下各个成员的地址,看看是不是这样:
我们可以看到每个成员地址都是一样的,它们确实共用一块地址。
上面这段代码我们可以看到:a的第四个字节的内容修改为55了.
3.联合体大小的计算
通过上面的观察我们可以发现,结构体比较浪费空间,而联合体是比较节省空间的。
所以联合体计算大小:
1.联合的⼤⼩⾄少是最⼤成员的⼤⼩。
2.当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。
下面我们来看例子:
它们的大小为什么是这么多呢?
从上面我们可以看出:联合体是非常节省空间的,但也不是无节制的节省。
二、枚举
枚举也是一个自定义类型,枚举顾名思义就是⼀⼀列举,把可能的取值⼀⼀列举。
比如:一周的星期一到星期日可以列举出来;
月份有十二个月也可以列举,等等。
1.枚举类型的声明
枚举的声明也和结构体类似。如:
以上定义的 enum days , enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1。如:
当然在声明枚举类型的时候也可以赋初值,如:
通俗来讲,枚举类型和#define差不多,但是并不相同。
2.枚举类型的优点
我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?
枚举的优点:
1. 增加代码的可读性和可维护性;
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨;
3. 便于调试,预处理阶段会删除 #define 定义的符号;
4. 使⽤⽅便,⼀次可以定义多个常量;
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤。
所以说枚举还是有许多优点的。
3.枚举类型的使⽤
那么枚举该怎么使用呢?最主要的用法上面已经介绍了。
那是否可以拿整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
好了,以上就是本篇文章的全部内容了,感谢大家的观看,创作不易,三连支持一下吧!