本篇将讲解联合体和枚举的基本知识,这两个类型相对于结构体要简单一些,只要了解了结构体,它们学起来会非常容易
目录
联合体
像结构体⼀样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间所以联合体也叫:共用体
给联合体其中一个成员赋值,其他成员的值也跟着变化
声明:
联合体的声明和结构体一样,关键字是 union
struct tag
{
member-list;
}variable-list;
member-list 是成员列表,variable-list 是定义联合体同时所创建的这个联合体类型的全局变量
联合体的大小:
1.联合体的大小至少是最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍(注意:这个条件在很多地方乃至有些教科书上都是没有写的,都是默认只有上面的第一个条件)
联合体的特点:
联合体的成员是共用同一块内存空间的,联合变量的大小至少是最大成员的大小
下面图文讲解以便理解:
代码运行验证 :
注意: 上图例涉及一点大小端存储模式,可以点击我以了解大小端
并且,联合体的使用也是和结构体一样,都是用 " . " (点操作符) 和 " -> "(箭头操作符) 来访问成员的,若也有不了解的小伙伴可以点击我,学习“结构访问操作符”内容
注意:
对于上面图例,这里还可以提一点,有人可能不清楚为什么 变量b 的内存 为什么在低地址那,我这里说一个规律,栈区的内存分配是从高地址往低地址的,比如上面我们创建 union U 类型的变量 n,给它分配了一块地址较高的空间,但是,在这块空间内,我们的多个成员的内存分配还是从低地址往高地址增长的,像其他类型的数据也是这样的(比如数组),我们可以理解为分配整块大空间时是从高地址往低地址分配,而给这块大空间内的小空间分配时还是从低地址往高地址分配的(再再提一嘴,大伙要分清 栈顶 和 栈底 的意思哦,关于这些方面的文章我还没有写,所以大家想了解只能自己去找了)
枚举类型
枚举类型有点特殊,特殊在它的作用,很多初学者不知道它到达有什么作用,而且也基本使用不到, 所以即便了解了它也会觉得迷迷糊糊、莫名其妙的感觉,不过以后见得多、用的多慢慢就明白了
枚举类型的作用和优点:
因为它那一点点的特殊性,我们这里就先说清楚它是拿来干嘛的,以便后面好理解
作用:
列举一系列成员,并将它们定义为常量值(这些成员也就是标识符)
优点:
1.增加代码的可读性和可维护性
2.枚举有类型检查,比 #define 定义的标识符更加严谨(前者有类型,而后者没有)
3.便于调试,预处理阶段会删除 #define 定义的符号(调试时枚举具有可观察性,而 #define 没有)
例:比如定义 GOD 为 1 ,在调试时,#define 定义的符号只能看见所定义的值(也就是只能看见 1),而枚举可以看见 GOD,并显示 GOD 值是 1(自己调试看看就能更加明白了~)
4.使用方便,一次可定义多个常量
5.枚举常量遵行作用域规则的,枚举声明在函数内则只能在函数内使用,而 #difine 定义的是全局的
因为枚举的作用和 #define 差不多,所以这里拿它们俩比较
枚举类型的声明:
枚举类型声明的格式也和结构体很类似,不过每一个成员是以逗号隔开的,关键字是 enum
例:
enum Sex
{
MALE,
FEMALE,
SECRET
};
注意:最后一个成员不用写逗号
{ } 中的内容是枚举类型的可能取值,也叫枚举常量,这些取值默认从 0 开始,依次递增 1,在声明枚举类型时也可以赋初值
注意:这些枚举常量是常量,是不能被修改的
例:
#include<stdio.h>
int main()
{
enum Sex
{
男 = 3,
女,
保密 = 7
};
int people = 0;
printf("请输入性别:男3,女4,保密5\n");
scanf("%d", &people);
if (people == 3)
printf("男性\n");
//
if (people == 女)
printf("女性\n");
return 0;
}
大家可以看看区别,people == 3 和 people == 女,当你以后或者别人来看你的代码时,是前面一个更容易理解呢还是后面一个呢,这就是枚举类型的作用及优点所在了