1.联合体
1.1联合体类型的声明
联合体与结构体类似,都是由一个或多个成员组成,并且各个成员可为不同的类型。
联合体最大的特点:所有的成员公用同一块内存空间,所以联合体还有一个别称叫共用体
注意:给联合体一个成员赋值,其他成员的值也会变化
# include <stdio.h>// 联合类型的声明union Un{char c;int i;};int main (){// 联合变量的定义union Un un = { 0 };// 计算连个变量的⼤⼩printf ( "%d\n" , sizeof (un));return 0 ;}
1.2联合体的特点
联合体的成员是共用同一块内存空间的,所以联合变量的大小至少是最大成员大小。
# include <stdio.h>// 联合类型的声明union Un{char c;int i;};int main (){// 联合变量的定义union Un un = { 0 };un.i = 0x11223344 ;un.c = 0x55 ;printf ( "%x\n" , un.i);return 0 ;}
最终输出的结果为:
11223355
由于联合体是共用一块内存空间的,故i的第四个字节的内容就被修改为55了。
以下为un的内存布局图:
1.3相同成员的结构体和联合体对比
二者最大的不同就是内存空间的利用率
结构体:
struct S{char c;int i;};struct S s = { 0 };
联合体:
union Un
{
char c;
int i;
};
union Un un = {0};
以下为二者的数据在内存中的分布图:
1. 4联合体大小的计算
•
联合的⼤⼩⾄少是最⼤成员的⼤⼩。
•
当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。
# include <stdio.h>union Un1{char c[ 5 ];int i;};union Un2{short c[ 7 ];int i;};int main (){// 下⾯输出的结果是什么?printf ( "%d\n" , sizeof ( union Un1));printf ( "%d\n" , sizeof ( union Un2));return 0 ;}
对于Un1,最大对齐数为int类型的4,而最大成员 char c[5]的大小为5,故Un1的大小为最大对齐数的两倍即为8,同理可得出Un2的大小为16。
2.枚举类型
2.1枚举类型的声明
顾名思义枚举就是列举,比如:列举星期,列举性别,列举颜色
代码如下:
enum Day // 星期{Mon,Tues,Wed,Thur,Fri,Sat,Sun};enum Sex // 性别{MALE,FEMALE,SECRET} ;enum Color // 颜⾊{RED,GREEN,BLUE};
上面的enum Day,enum Sex,enum Color都是枚举类型。
{}中的内容为枚举常量
这些可能取值都是有值的,默认从0开始,依次递增1,也可以在声明枚举类型的时候赋初值,如下所示:
enum Color // 颜⾊{RED= 2 ,GREEN= 4 ,BLUE= 8};
2.2枚举类型的优点
枚举类型的作用与#define的作用类似,但相较于#define,枚举类型有属于自己的优势:
1.增加代码的可读性和克维护性。
2.相较于#define定义的标识符比较枚举有类型检查,更加严谨。
3.便于调试,预处理会删除#define定义的符号
4使用方便,一次可以定义多个常量、
5.枚举常量是遵循作用域规则,枚举声明在函数内,只能在函数内使用