3.枚举
枚举顾名思义就是一一列举
把可能的取值一一列举
比如我们现实生活中
一周的星期一到星期日是有限的7天,可以一一列举
性别有:男、女、保密,也可以一一列举
月份有12个月,也可以一一列举
这里就可以使用枚举了
3.3.1 枚举类型的定义
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型
{}中的内容是枚举类型的可能取值,也叫 枚举常量
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值
例如:
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
3.3.2 枚举的优点
为什么使用枚举?
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨
- 便于调试
- 使用方便,一次可以定义多个常量
3.3.3 枚举的使用
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5; //ok??
这里只能利用枚举变量进行赋值,在C语言里面也许可以用整型进行赋值,但是在C++里面就肯定不行了,因为C++语法检测更严格
4 联合—共用体
4.4.1 联合类型的定义
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
比如
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
union Un
{
char c;
int i;
};
int main()
{
printf("%d\n", sizeof(union Un));
union Un un = { 0 };
//un.i = 0x11223344;
//un.c = 0x55;
printf("%p\n", &un);
printf("%p\n", &(un.i));
printf("%p\n", &(un.c));
return 0;
}
4.4.2 联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
sizeof联合体打印出来的是4,为什么会是4个,char占1个字节,int占4个字节,再怎么说我也得占至少5个字节啊
为了解决我们心中的疑惑,我们创建一个联合体变量un,赋值为0
我开辟了4个字节,int和char共用四个字节,所以联合体也称为共用体,并且地址都为起始位置
大家可能有疑惑,你怎么证明int和char共用一个空间呢
我们举个例子,看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
union Un
{
char c;
int i;
};
int main()
{
printf("%d\n", sizeof(union Un));
union Un un = { 0 };
un.i = 0x11223344;
un.c = 0x55;
return 0;
}
我们将代码调试起来看一下结果
当然我的电脑上不知道为什么看不起了,你们可以在自己的电脑上打开VS,按F10调试起来,点击调试,点击调试,窗口,再点击内存就可以发现,我先按照小端的方式存放的44 33 22 11 然后再将55代替44的位置
我们如何利用代码来判断大小端存储呢
看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int check_sys()
{
union
{
int i;
char c;
}un = { .i = 1 };
return un.c;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
大小端存储方式不一样,我们就先让int类型为1,大小端的存储方式如上图
4.4.3 联合大小的计算
联合的大小至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
比如
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
前面我们学习了对齐数,忘记的同学可以回去翻来看一看,这里的Un1本身最大求出来是5,但是5不是4的倍数,所以最小的倍数都是8,所以打印出来8
那么对于Un2呢?,short类型占2个字节,默认对齐数为2,
Int类型的对齐数为4,本身打印的是14,也就是short类型的总大小,但是14不是4的倍数,所以我最小打印的都是16
这下大家清楚了吧!