目录
一、枚举是什么?
很简单,把可能的取值一一列举出来
格式:
enum 枚举名字
{
枚举的可能取值
list1,
list2,
....
lastlist//最后一个枚举没有逗号
}
枚举的取值是从0开始,依次增加
示例:
enum enumeraExample
{
list1,
list2,
....
lastlist
}
对该枚举
list1的值为0
list2的值为1
以此类推
但是枚举成员也可以自己初始化,例如list1=9,//那么此时其值就为9,但是后面的值如果没有赋值,就会自动在前一个成员的基础上加1,即list2变成10,以此类推
枚举类型的成员一般用英文大写,可以理解为常量,因为在枚举的外部不能被赋值。为什么?因为枚举成员是枚举类型的,如果要赋值就会出现类型不兼容的问题
这些成员可以用来赋值
枚举和#define自定义宏的区别,以及枚举的优点
优点:
1、枚举有类型检查,更安全
2、代码可读性和可维护性
3、便于调试:为什么?因为在#define中,只要遇到定义就会改变其值为定义的某个值,即后面可以改变其值。而枚举就不会,在枚举的外部不能被赋值,因为枚举成员是枚举类型的,如果要赋值就会出现类型不兼容的问题。这个性质决定,如果枚举有Bug,那么只可能出现在枚举定义那个地方,便于检查调试。
4、一次可以定义多个常量,方便
二、联合体:
关键字:union
示例:
union un
{
char o;
int i
};
内部可以定义多个不同类型的变量,特点是他们共用一块内存空间
联合体的大小至少是最大成员的大小,因为联合体至少要能存储最大成员
这里需要了解一个知识点:即数据在计算机内的存储规则都是将其按某种方式转换成二进制格式再存储到计算机内的,而这个二进制是有大小位之分的。而计算机内部的空间已经分配好了地址,地址也是编号,编号也有高低之分。那么此时给你一块空间:
这就要提出两个概念:
小端存储:将数据的字节的低位放在内存中低位,高位放在高地址
大端存储:将数据的字节的低位放在内存种的高位
格式:
union {
char c;
int i ;
}u;
u.i=1;
联合体可以用于机器大小端的测验。例如我们的vs是小端存储,有兴趣可以自己测试,怎么做?通过按位与&计算得到内存的字节,很简单:
return *(char*)&u;//访问联合体地址一个字节,并解引用。如果结果是1,那么就说明低位放在低位,因为1的二进制在内存中是这样存放的:10 00 00 00 ,即小端口
地址的一般是从左到右由低到高
注意:
联合体的大小不一定不是最大成员的大小
联合体的大小最小是最大成员的大小
当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
(关于对齐数的概念,可以参考博主另一篇关于结构体详解那篇文章)
联合体的应用场景:当多个变量不会同一时间使用,只会有一个使用的时候就可以使用联合体
本质上,还是为了节省空间的考虑。
所以你会发现C语言对于节省空间有很多设计,例如对齐数,位段等。
典型应用:商品抽奖
在描述从多个商品种抽出一个的时候,每个商品有不同的属性,而所有的属性在选出时只会出现一次,后面抽奖池就没有了该商品,就再也没用了。因此我们就可以使用联合体内描述所有的属性,谁要用就直接调用
进而节省了空间,因为这个空间共用