当前位置 博文首页 > persistence_Y的博客:枚举和联合(共用体)

    persistence_Y的博客:枚举和联合(共用体)

    作者:[db:作者] 时间:2021-08-07 13:00

    从名字来看,枚举的意思就是列举,把可能的取值列举出来.
    从我们的日常生活中来看,有很多例子:
    1.一周的星期一到星期日是固定的7天,就可以列举出来.
    2.从性别来看,有男,女两种.
    3.月份也类似于一周,有固定的十二个月,也可以列举出来.
    类似于这样的例子有很多,碰到这样的情况,我们就可以使用枚举了.
    枚举类型的定义
    先来看几个例子:

    enum Day{	//星期
    	Monday,
    	Tuesday,
    	Wednesday,
    	Thursday,
    	Friday,
    	Saturday,
    	Sunday
    };
    enum Sex{	//性别
    	Male,
    	Female
    };
    enum Color{	//颜色
    	Red,
    	Yellow,
    	Blue
    };
    

    在上面我们定义的enum Day, enum Sex, enum Color都是枚举类型.
    在{}中的内容是枚举类型的可能取值,也叫作枚举常量.
    枚举常量的取值默认从0开始,依次递增1,当然我们可以在定义的时候给枚举常量赋初值.比如:

    enum Color{	//颜色
    	Red = 1,
    	Yellow = 2,
    	Blue = 4
    };
    

    枚举的优点:
    1.枚举能够增加代码的可读性和可维护性
    2.枚举由类型检查,更加严谨
    3.便于调试
    4.使用方便,可以一次定义多个常量

    枚举的使用

    enum Color{	//颜色
    	Red = 1,
    	Yellow = 2,
    	Blue = 4
    };
    enum Color clr = Blue;	//只能拿枚举常量给枚举变量赋值
    int main(){
    	printf("%d\n", clr);
    	system("pause");
    	return 0;
    }
    

    不能像下面这样使用

    enum Color{	//颜色
    	Red = 1,
    	Yellow = 2,
    	Blue = 4
    };
    enum Color clr = Blue;
    clr = 5;
    int main(){
    	printf("%d\n", clr);
    	system("pause");
    	return 0;
    }
    

    这样就会报错,提示重定义,多次初始化
    在这里插入图片描述
    关于联合类型的定义
    联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,而他们的特征就是这些成员会共用同一块空间(所以联合也叫共用体),比如:

    #include <stdio.h>
    #include <stdlib.h>
    //联合类型的声明
    union Un{
    	char c;
    	int i;
    };
    //联合变量的定义
    union Un un;
    int main(){
    	//计算联合变量的大小
    	printf("%d\n", sizeof(un));
    	system("pause");
    	return 0;
    }
    

    联合体的成员是共同运用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(联合体至少得有能力保存最大的那个成员)

    #include <stdio.h>
    #include <stdlib.h>
    union Un{
    	int i;
    	char c;
    };
    union Un un;
    int main(){
    	printf("%d\n", &(un.i));
    	printf("%d\n", &(un.c));
    	system("pause");
    	return 0;
    }
    

    思考一下,下面的输出结果一样吗?
    printf("%d\n", &(un.i));
    printf("%d\n", &(un.c));

    在这里插入图片描述
    联合体共用同一块空间,所以输出结果一样.

    关于联合体大小的计算
    1.联合体的大小至少是最大成员的大小.
    2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍.

    比如:

    #include <stdio.h>
    #include <stdlib.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));
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述
    首先它们的最大对齐数都是4,Un1的最大成员大小为5,不是4的整数倍,所以对齐到8字节.Un2的最大成员大小为14(short类型为2字节),不是4的整数倍,所以对齐到16字节.

    cs