1.联合体问题引入? ?? ?如果一个学生选修课,选择了美术,就不能选择音乐 ?? ?如何描述这些互斥的场景呢?用结构体?当然不合适,还有就是空间问题? ?? ?答案是联合体(共用体) ?? ? 2.联合体的基本概念? ?? ?联合体和结构体的结构非常相似,但是有一个本质的区别: ?? ?结构体的每一个成员都是相互各自独立的,而联合体的每个成员都是共用一块内存 ?? ?因此联合体又称为共用体。 ?? ? 3.联合的定义 ?? ?union 联合体名 ?? ?{ ?? ??? ?成员类型1 成员1; ?? ??? ?成员类型2 成员2; ?? ??? ?... ?? ?}; ?? ?语言:联合体名是用来区分不同的联合体 ?? ?成员 是包含在联合体内部的数据,可以是任意数据类型 ?? ?例子:
union data ?? ?{ ?? ??? ?int x; ?? ??? ?char y; ?? ??? ?double z; ?? ?};
4.联合体初始化 ?? ?// 普通初始化,只有第一个有效,后面的就无效了,编译会警告,只能初始化第一个成员
?//union data udata = {'k',18,3.14}; ?? ?union data udata = {'k'}; ?? ?printf("%c,%d,%f\n",udata.x,udata.y,udata.z);
? ?// 指定成员初始化,只有最后一个成员有效
?? ?union data udata1 = {.x = 'a', .y = 20, .z = 3.14}; ?? ?printf("%c,%d,%f\n",udata1.x,udata1.y,udata1.z);
? ?// 联合体成员的引用,如果都给成员赋值默认输出的是空间的最大值数据 ?? ?// 输出3.14
?? ?union data udata2; ?? ?udata2.x = 'b'; ?? ?udata2.y = 100; ?? ?udata2.z = 3.14; ?? ?printf("%c,%d,%f\n",udata2.x,udata2.y,udata2.z);
? ?//联合体指针
?? ?union data *pdata = &udata2; ?? ?pdata->x = 'c'; ?? ?pdata->y = 200; ?? ?pdata->z = 4.15; ?? ?printf("%c,%d,%f\n",pdata->x,pdata->y,pdata->z);
5.联合体的内存大小为成员的最大值,如上union data的大小为8字节 ?? ? 6.联合体使用场景?? ? ?? ?联合体一般不会单独使用,而是以结构体的成员方式存在,用来表示互斥的效果,即一次只能赋予一个值 ?? ?用来表示某种互斥属性,比如学生选修课
?? ?struct student ?? ?{ ?? ??? ?char name[20]; ?? ??? ?int age; ?? ??? ?union cur ?? ??? ?{ ?? ??? ??? ?int yuwen; ?? ??? ??? ?float shuxue; ?? ??? ??? ?double yinyu; ?? ??? ?}d; ?? ?}; ?? ? ?? ?int main() ?? ?{ ?? ??? ?struct student st[2]; ?? ??? ?strcpy(s[0]t.name,"jack"); ?? ??? ?st[0].age = 18; ?? ??? ?st[0].d.yuwen = 1; ?? ??? ? ?? ??? ?printf("%d\n",st[0].d.yuwen); ?? ??? ? ?? ??? ?strcpy(s[1]t.name,"rose"); ?? ??? ?st[1].age = 19; ?? ??? ?st[1].d.shuxue = 1.1; ?? ??? ? ?? ??? ?printf("%f\n",st[1].d.shuxue); ?? ??? ? ?? ?}
1.枚举类型问题引入 ?? ?char 1字节 -128---127 ?0---255,但是有些时候我们不用这么多数据 ?? ?比如一周的工作时间,周一到周五 5个数据,有什么数据类型可以描述这场景 ?? ?答案是枚举类型 ?? ? 2.枚举的定义 ?? ?enum 枚举类型名{枚举元素列表} ?? ?enum ? ? ? ? ? {枚举元素列表} ?? ?例子: ?? ?enum weekday{mon,tue,wed,thu,fri}; ?? ? 3.枚举成员引用 ?? ?enum weekday workday = mon; ?? ? 4.枚举的使用场景dmeo
?? ?enum weekday{mon,tue=100,wed=99,thu,fri};
?? ?enum {up,down,left,right};
?? ?enum {red=0xff0000,green=0x00ff00,blue=0x0000ff};
?? ?int func() ?? ?{ ?? ??? ?return up; ?? ?}
?? ?int main() ?? ?{ ?? ??? ?enum weekday workday = wed; ?? ??? ?printf("%d,%d,%d,%d,%d,%d\n",mon,tue,wed,thu,fri,workday); ?? ??? ?// 枚举的使用场景 ?? ??? ?if(func() == up) ?? ??? ?{ ?? ??? ??? ?printf("up\n"); ?? ??? ?} ?? ??? ? ?? ??? ?int color; ?? ??? ?switch(color) ?? ??? ?{ ?? ??? ??? ?case red: ?? ??? ??? ??? ?printf("处理红色\n"); ?? ??? ??? ??? ?break; ?? ??? ??? ?case green: ?? ??? ??? ??? ?printf("处理绿色\n"); ?? ??? ??? ??? ?break; ?? ??? ??? ?case blue: ?? ??? ??? ??? ?printf("处理蓝色\n"); ?? ??? ??? ??? ?break; ?? ??? ?} ?? ??? ? ?? ??? ?return 0; ?? ?}
总结: enum weekday{mon,tue,wed,thu,fri}; // mon = 0,tue = 1,wed = 2,thu = 3,fri = 4 1.枚举第一个值默认为0 ?? ?比如mon为0,后面的大小依以此类推 1,2,3,4 ?? ? 2.如果枚举变量里面某个成员设置了数值,往后的其它成员的数值在它基础上进行累加 ?? ?enum weekday{mon,tue=100,wed,thu,fri}; // mon = 0,tue = 100,wed = 101,thu = 102,fri = 103 ?? ? 3.枚举常量实际就是一个整型,首个枚举常量默认为0
4.枚举在c语言的作用是增加代码的可读性?? ? ?? ?
? ??
|