共用体 枚举
共用体(联合体)
共用体与结构体的区别
1、结构体关键字:struct
每个成员拥有独立的空间
2、共用体关键字:union
所有成员共享同一份空间
共用体的空间大小
公用体的空间大小由最大的成员决定
1 2 3 4 5 6
| union data1{ char a; int b; short c; }; printf("%d\n",sizeof(union data1));
|
运行结果:
分析:union data1
成员中最大的为 int b
占4字节
案例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include<stdio.h> union data1{ char a; int b; short c; }; int main(int argc,char *argv[]){ union data1 z; z.a=10; z.b=20; z.c=30; printf("%d\n",z.a+z.b+z.c); return 0; }
|
运行结果:
分析:因为空间是公用的,前面空间被赋的值被后面赋的值覆盖了,然而三个变量指向的是同一个空间,而且取出来的都是30,所以结果为90
案例2:
问:由案例1得出,共用体是最后一次赋值才有效,这个结论是对是错?(不严谨,错的)
共用体虽然公用同一份空间,但是从空间读取的字节数是由成员自身类型决定的(重要)
问:下面代码的输出结果?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include<stdio.h> union data1{ char a; short b; int c; }; int main(int argc,char *argv[]){ union data1 z; z.c=0x01020304; z.b=0x0102; z.a=0x01; printf("%#x\n",z.a+z.b+z.c); return 0; }
|
运行结果:
分析:
注意,倒着存倒着取
枚举
引入
试想一下,如果不用枚举,一个星期7天我们要用#define来为每个整数定义一个宏(别名)
1 2 3 4 5 6 7
| #define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define SUN 7
|
如果用枚举:
1 2 3 4
| enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
|
这样代码就简洁多了,实际上枚举就是一个个的宏
注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
枚举变量的定义和使用
1、先定义枚举类型,在定义枚举变量
1 2 3 4 5
| enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; enum DAY day;
|
2、定义枚举类型的同时定义枚举变量
1 2 3 4
| enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
|
3、省略枚举名称,直接定义枚举变量
1 2 3 4
| enum { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
|
可以在定义枚举改变枚举元素的值
1 2
| enum season {spring, summer=3, autumn=8, winter}; printf("%d %d %d %d\n",spring,summer,autumn,winter);
|
运行结果:
案例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h> enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; int main() { enum DAY day; day = WED; printf("%d",day); return 0; }
|
运行结果:
案例:枚举在 switch 中的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <stdio.h> int main(int argc,char *argv[]) { enum color { red=1, green, blue }; enum color favorite_color; printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): "); scanf("%d", &favorite_color); switch (favorite_color) { case red: printf("你喜欢的颜色是红色"); break; case green: printf("你喜欢的颜色是绿色"); break; case blue: printf("你喜欢的颜色是蓝色"); break; default: printf("你没有选择你喜欢的颜色"); } return 0; }
|
运行结果: