🌇个人主页:麦麦
📚今日名言:如果不去遍历世界,我们就不知道什么是我们精神和情感的寄托,但我们一旦遍历了世界,却发现我们再也无法回到那美好的地方去了。当我们开始寻求,我们就已经失去,而我们不开始寻求,我们根本无法知道自己身边的一切是如此可贵。——《小王子》
一、前言
在前几篇文章中我们已经了解了结构体并用结构体来实现了通讯录,但其实C语言中的自定义类型还有两大成员:**枚举**和**联合**。在接下来的篇幅中我们就将对这两位成员进行详细地讲解!
二、正文
1.枚举
枚举,顾名思义就是一一列举,把**可能的取值一一列举**。比如我们显示生活中:一周的星期一到星期日是有限的7天,可以一一列举。性别也可以一一列举成:男、女。
1.1枚举的定义
枚举是一种自定义类型,有了类型我们就可以创建变量,那么具体要怎么使用呢,见如下代码:
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECREAT
};
enum Color//颜色
{
Red,
Green,
Blue
};
以上定义的“enum Day”,“enum Sex”,“enum Color”都是枚举类型。{}中的内容是枚举类型的可能取值,也叫**枚举常量**。这些可能取值都是有值的,默认从0开始,一次递增1,当然也可以赋初值。
#include <stdio.h>
enum Color//颜色
{
Red=5,
Green=2,
Blue=0
};
enum Sex//性别
{
MALE,
FEMALE,
SECREAT
};
int main()
{
printf("MALE=%d\n", MALE);
printf("FEMALE=%d\n", FEMALE);
printf("SECREAT=%d\n", SECREAT);
printf("小伙伴们%d", Red);
printf("%d", Green);
printf("%d", Blue);
return 0;
}
注:一旦当我们初始化之后,就不可以再修改默认值了哦。
enum Color//颜色
{
Red=5, //初始化为5
Green=2, //初始化为2
Blue=0 //初始化为0
};
int main()
{
Red=2; //初始化之后是不可以再改变默认值的
return 0;
}
1.2枚举的优点
有的小伙伴可能会问:既然枚举中的内容是枚举常量,那么我们也可以使用“#define”来定义常量,为什么非要使用枚举呢?
枚举的优点:
1.增加代码的可读性和可维护性
2.防止了命名污染(封装)
3.和#define定义的标识符有类型检查,更加严谨
4.便于调试
5.使用方便,一次可以定义多个常量
下面我们以通讯录为例来讲讲枚举为什么可以增加代码的可读性。在看过上一篇通讯录的文章后,有的小伙伴下来在敲写case代码的时候,可能看到数字一时无法想起这个数字到底代表的是什么功能,那么我们就使用枚举来对通讯录进行一次小小的优化。
enum fac
{
Exit,
Add,
Del,
Search,
Modify,
Show,
Sort
};
int main()
{
contact Contact; //创建通讯录
contact tmp;
Init_Contact(&Contact); //初始化通讯录
Init_Contact(&tmp);
int input = 0;
do
{
menu(); //打印菜单
printf("请选择你所需的功能:");
scanf("%d", &input);
switch (input)
{
case Add:
AddContect(&Contact);
break;
case Del:
DelContect(&Contact);
break;
case Search:
SearchContect(&Contact);
break;
case Modify:
ModifyContect(&Contact);
break;
case Show:
ShowContect(&Contact);
break;
case Sort:
sortContect(&Contact,&tmp);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
}
}
while (input);
return 0;
}
3.3枚举的使用
enum Color //颜色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr=GREEN;
注:既然枚举是一种类型,就可以重定义
typedef enum Color //颜色
{
RED=1,
GREEN=2,
BLUE=4
}Color;
2.联合体(共用体)
2.1联合类型的定义
联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员**公用同一块空间**(所以联合也叫共用体),但是**不能同时使用这块空间**。可能小伙伴们听得还是有些云里雾里,代码如下:
//联合体的定义
#include <stdio.h>
union UN
{
char c;
int i;
};
int main()
{
union UN un;
//猜猜结果如何?
printf("%d\n", sizeof(un));
printf("%p\n", &un);
printf("%p\n", &(un.c));
printf("%p\n", &(un.i));
return 0;
}
我们可以看出联合体的大小并不是我们想象的至少是5,而是4。并且两个成员的起始地址都是相同的,也可以间接说明它们是共用同一片空间的。
2.2联合的特点
联合的成员是共用同一块内存空间的,这样一个**联合变量的大小,至少是最大成员的大小**(因为联合至少有能力保存最大的那个成员)。依旧以上面代码画图演示。
我们可以发现 成员’c‘和成员’i‘在第一个字节的空间是共用的,不过这一块空间并不是同时使用的,当成员’c‘使用的时候就会将这块空间修改成自己的内容,成员’i‘也是如此。
2.3联合大小的计算
联合的大小至少是最大成员的大小 当最大成员大小不是最大对齐数的整数倍的时候,就要**对齐到最大对齐数的整数倍**
//联合的大小
#include <stdio.h>
union UN
{
char c[5]; //对齐数1
int n; //对齐数4
};
int main()
{
union UN un;
printf("%d\n", sizeof(un));
return 0;
}
三、结语
到此为止,关于C语言自定义类型点的学习就告一段落了。 关注我 **_麦麦_**分享更多干货:_麦麦_的博客_CSDN博客-领域博主 大家的「**关注❤️ + 点赞👍 + 收藏⭐**」就是我创作的最大动力!谢谢大家的支持,我们下期见!
版权归原作者 _麦麦_ 所有, 如有侵权,请联系我们删除。