目录
枚举
就是列举对象,比如一周里面可以一一列举出星期一到星期天
枚举类型的定义
例如以下三种枚举的定义
// 星期enum Day{Mon ,Tues ,Wed ,Thur ,Fri ,Sat ,Sun};// 性别enum Sex{MALE ,FEMALE ,} ;// 颜色enum Color{RED ,GREEN ,BLUE};
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。{ } 中的内容是枚举类型的可能取值,也叫 枚举常量 。这些可能取值都是有值的,默认从 0 开始,一次递增 1 ,当然在定义的时候也可以赋初值。
当然我们也可以改它们的数值
枚举的优点
当然我们还可以使用 #define 定义常量枚举的优点:1. 增加代码的可读性和可维护性2. 和 #define 定义的标识符比较枚举有类型检查,更加严谨。3. 防止了命名污染(封装)4. 便于调试5. 使用方便,一次可以定义多个常量
注意事项
枚举是有类型的,注意这一点比较重要,一些代码在C中可以运行但是在例如在语法更严格的C++上面会出错
例如在C中,这是被允许的
#include<stdio.h>
enum Day
{
Mon = 1, //枚举常量
Tues,
};int main() {
enum Day S = 5; //在C中可以这样写,但是在语法更严格的C++中是不被如同的
return 0; //因为枚举常量是不可以修改的
}
在C++中会直接报错,因为类型是不可以修改的
联合(共用体)
联合类型的定义
联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
//联合体
#include<stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
union Un u;
//计算变量的大小
printf("%d\n", sizeof(u));
printf("%p\n", &u);
printf("%p\n", &(u.c));
printf("%p\n", &(u.i));
return 0;
}
我们会发现这么一个独特的现象
联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
利用联合体的特点可以,求出当前计算机的大小端的情况
//得出当前机器的大小端问题
#include<stdio.h>
int Check_sys()
{
//法一:利用类型的特性来得出大小端
//int i = 1;
//return *(char*)&i;
//法二:利用联合体的特点得出大小端
union Un
{
int i;
char c;
}u;
u.i = 1;
return u.i;
}
int main() {
int ret = Check_sys();
if (ret = 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
联合大小的计算
观察下面的几行代码可以知道联合体其实和结构体一样都存在对齐
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
结束语
随着时间的推移,代码量的提升,眼中也渐渐可以看懂更多的代码了,真是一个美妙的境界,就像打怪升级一般,歪歪