忽略点九:共用体与枚举类型
共用体?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
好啦,共用体和枚举类型查缺补漏完毕!
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!