前言
之前我们学习了自定义数据类型里的结构体,还顺带着学习了位段
今天,我们就来学习枚举和共用体,我们开始吧
自定义类型:结构体
位段详解
枚举
枚举就是一一列举
枚举类型的定义
枚举类型的创建
enum Day
{
mon,//此处是逗号
tues,
thur,
};//;不能少
enum:是类型关键字
{}里的就是可能的取值,都是常量
第一个常量的值默认是0,之后挨个增加
初始值可以改变,当不改变时就认为是前一个常量的值加一
下面给出三个例子方便大家理解
1
enum Day
{
mon,
tues,
thur,
};
int main()
{
enum Day d1 = mon;
printf("%d %d %d\n", mon, tues, thur);
return 0;
}
运行结果:
2
enum Day
{
mon = 1,
tues = 3,
thur = 5,
};
int main()
{
enum Day d1 = mon;
printf("%d %d %d\n", mon, tues, thur);
return 0;
}
运行结果:
3
enum Day
{
mon,
tues = 3,
thur,
};
int main()
{
enum Day d1 = mon;
printf("%d %d %d\n", mon, tues, thur);
return 0;
}
运行结果:
枚举类型的使用
enum Day
{
mon,
tues,
thur,
};
int main()
{
enum Day d1 = mon;
return 0;
}
创建变量需要写上关键字,并且变量的值只能是定义中的某一个值
注意
不要给枚举常量赋值,这是错误的
enum Day d2 = 4;
枚举类型的大小
我们用一段代码来解释这个问题:
enum Day
{
mon,
tues,
thur,
};
int main()
{
enum Day d1 = mon;
printf("%zd\n", sizeof(d1));
return 0;
}
运行结果:
原因
因为上文提到了,mon这些成员的值默认是整数,都是int类型
所以我们可以知道他们的大小都是4个byte
注意
枚举类型的值是不可改变的,是由编译器决定的,所以大小就是固定的4byte
枚举的优点
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
联合(共用体/联合体)
联合的定义
union Un
{
char c;
int i;
};
int main()
{
union Un u;
return 0;
}
union是联合关键字
联合的特点
先来看一段代码,下面代码的结果是什么
union Un
{
char c;
int i;
};
int main()
{
union Un u;
printf("%zd\n", sizeof(u));
printf("%p\n", &u);
printf("%p\n", &(u.i));
printf("%p\n", &(u.c));
return 0;
}
运行结果:
能看出来,他们的地址是相同的,也就是说他们都从同一块空间开始存储、占用同一块空间,这就是共用体的名称来源
所以联合体至少是最大成员的大小,在上面这道题中,就是4
提示
因为成员都从同一块空间存储,所以不能同时使用
联合体的使用
引入
先看一道笔试题:
判断当前机器的大小端存储(字节存放顺序)
使用指针
int check_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小\n");
}
else
{
printf("大\n");
}
return 0;
}
使用联合体
int check_sys()
{
union Un
{
char c;
int i;
}u;//此处可以像结构体一样,创建一个全局的联合体变量
u.i = 1;
return u.c;//返回的是第一个字节
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小\n");
}
else
{
printf("大\n");
}
return 0;
}
联合体的大小
下面这段代码的运行结果是:
union Un
{
int a;
char arr[5];
};
int main()
{
union Un u;
printf("%zd\n", sizeof(u));
return 0;
}
计算联合体大小的规则
联合体的大小至少是最大成员的大小(类似结构体)
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
数组的对齐数:用其中一个元素的大小来和默认值比较
由上可知,4+1+3 == 8,结果是8
结语
自定义数据类型的知识介绍到这里就结束了,感觉收获很多呢
之后我利用已经学会的知识来尝试去实现通讯录,我们下篇文章见~