前言
本文所讲的枚举和联合体通常是和结构体一起讲,但因为结构体太多了,就另写一篇来介绍枚举和联合体。
一.枚举
枚举顾名思义就是一一列举,把可能的取值一一列举,例如十二生肖可以一一列举,周一到周日也可以一一列举。
1.枚举的定义
enum week
{
Mon,//枚举常量(0)
Tues,//1
Wed,//2
Thur,//3
Fri,//4
Sat,//5
Sun//6
};
{}中所放的就是枚举常量,枚举常量有一个特点就是默认为整型,并且每个枚举常量都有自己的值,如果你不去定义它的话,那么枚举常量的值就是从0开始依次递增,但是你可以去专门定义它的值。
例如:
enum week
{
Mon,//枚举常量(0)
Tues,//1
Wed=6,//6
Thur,//7
Fri,//8
Sat,//9
Sun//10
};
这里给wed赋了6,那么在它之后的枚举常量就会在6的基础上依次加1。当然你也可以每一个变量都赋值。
2.枚举的使用
枚举和结构体在定义方式和创建变量的方式上相似,但是你想要使用枚举中的枚举常量并不需要创建变量,你可以直接使用枚举里的枚举常量。
例如:
int main()
{
enum week today = Wed;
printf("%d",today);//通过创建变量使用枚举常量
printf("%d",Sat);//直接使用枚举常量
}
3.枚举的优点
讲到这里大家是不是觉得我使用define也可以定义这些枚举常量呀,那为什么还要用枚举呢?其实枚举的具备define所不具备的一些优点。
首先会增加代码的可读性和可维护性,枚举中放的一般会是同一个对象的不同可能取值,便于你维护程序,接着枚举类型具有类型检查功能,就是说枚举常量必须是整型,更加严谨,使用比define更加方便,一次可以定义多个常量。
二.联合体
联合体也是一种特殊的自定义类型,它的特点是所有成员共用一个内存空间。
1.联合体的定义
union num
{
char a;
int c;
};
联合体的定义方式和结构体一样,如果不知道结构体的定义方式请看结构体详解但是联合体和结构体最大的不同是结构体每个成员都要占用一定的空间,但是联合体是所有成员占用一块空间。
大家先看下面一段代码:
int main()
{
union num x;
x.a = 0x55;
x.c = 0x11223344;
printf("a = %x", x.a);//打印a的16进制
}
结果如下:
a为什么会等于44呢?这里就是因为a和c共用一块内存,我们来观察内存的变化。
可以看到这里的地址并没有发生变化,但是给c赋值的时候将a覆盖掉了,这就说明a和c共用一块存储空间。
2.联合体的使用
union num x = { .c = 2,.a = 1 };
联合体可以像结构体一样初始化,但是这里a的初始化是会影响c的,因为a后被初始化,会覆盖之前c的数据,联合体变量使用方式和结构体类似。
int main()
{
union num x = { .c = 2 };
union num* p = &x;
printf("c = %d\n", x.c);//第一种
printf("c = %d\n", p->c);//第二种
}
这里两种方式都可以访问联合体里的成员。
3.联合体的所占内存大小
联合体的大小必须大于等于最大成员的大小
最终大小必须对齐到最大对齐数的整数倍
4.联合体的作用
联合体可以用来判断计算机的数据存储方式(大小端)例如刚才的程序:
int main()
{
union num x;
x.a = 0x55;
x.c = 0x11223344;
printf("a = %x", x.a);//打印a的16进制
}
这里如果是大端存储的话那么打印出来应该是11如果是小端存储的话则会打印出44。
联合体还有很多其他的作用这里就不再一一列举。