忽略点九:共用体与枚举类型

​共用体?What?它是什么,上了两年大学的我有点懵逼。共用体已然成了我C语言的盲区。

​存在必然有它的意义,所以恶补了一下有关共用体的知识。

​在我的理解里,共用体和上一篇博文所介绍的结构体,都是用来存储不同数据类型的“容器”。

​那么他们两个的区别呢?从上上篇查缺补漏系列博文中 跳转至查缺补漏(七),我们知道结构体不同类型类型成员按照内存对齐规则,“排队”占用内存,而共用体,则是所有类型成员共用同一块内存(也就是说他们的起始位置都是从0开始)。

​既然所占用内存都是从0开始,那么共用体有两个特征:

——成员不会同时出现使用

后面出现的成员会覆盖掉之前成员的内容(也会相互影响),因为两者的内存地址都是从0开始的,例如:

union A {
    int a;
    int b;
};
//省略代码
A p1;
p1.a = 1; p1.b = 2;
printf("%d %d\n", p1.a, p1.b);		//结果p1.a,p1.b输出都为2
p1.a++;
printf("%d %d\n", p1.a, p2.b);		//结果p1.a, p1.b都输出为3

——收尾:

共用体所占内存的总大小,必须是它内部最大成员所占内存大小的整数倍(像数组,结构体等成员在计算时按其成员的最大成员所占内存算),不是要补齐

给大家上份代码理解一手:

union A {
    int a;		//所占内存地址为0~3
    int b;		//所占内存地址为0~3
    char s[10]; //所占内存为0~9
};				//共用体A总共所占内存地址为0~11

union B {
    double t;	//所占内存地址为0~7
    A a;		//所占内存地址为0~11
    int b[3];	//所占内存内存地址0~11
};				//共用体B总共所占内存地址为0~15

在共用体A中:

​int类型a为4字节,所以占用0~3位置

​int类型a为4字节,所以占用0~3位置

​char型数组s中最大成员单个char为1字节,而数组长度为10,所以占用0~9位置

​在共用体A中,最大成员为int型的4字节,所用占用内存大小为4的倍数,由于最大占用空间为10,所以共用体至少占用内存位置为0~11

在共用体B中:

​double类型t为8字节,所以占用0~7位置

​A类型a中最大成员为int类型为4字节,A类型总的内存占用为12字节,所以占用0~11位置

​int型数组b中最大成员单个int为4字节,而数组长度为3,所以占用0~11位置

​在共用体B中,最大成员为double型的8字节,所用占用内存大小为8的倍数,由于最大占用空间为12,所以共用体至少占用内存位置为0~15

由于共用体特别节省内存,所以大家不能学我,它在C语言中是不容忽略的!!!(比如用于存储IPV4,IPV6地址,可用共用体来存储)

​枚举类型大学期间使用次数仅仅比共用体好上那么一丢丢,举个枚举类型的栗子:

enum week {
    Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday			//注意,最后没有分号!!!!!
};

关于枚举类型只要记住两点就可以:

——枚举类型只能由整数成员组成,每个成员对应一个整数编号(默认从0开始)

​例如上边代码,默认Sunday的值为0,Monday的值为1,一直到Saturday的值为6

——枚举类型的值可相同,未显性赋值的成员将从它前一个显性编号的成员以此+1

​例如以下代码中:

enum week {
    Sunday = 1, Monday, Tuesday, Wednesday = 0, Thursday, Friday, Saturday			//注意,最后没有分号!!!!!
};

​上边代码中,Sunday为1,Monday为2,Tuesday为3,Wednesday为0,Thursday为1,Friday为2, Saturday为3

​好啦,共用体和枚举类型查缺补漏完毕!

转载请注明出处!!!

​如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!

10-04 14:22