当前位置 博文首页 > CW_qian的博客:8月22日笔记C语言基础(补4)联合体与枚举1
联合体基本概念
????????联合体的外在形式跟结构体非常类似,但它们有一个本质的区别:结构体中的各个成员是各自独立的,而联合体中的各个成员却共用同一块内存,因此联合体也称为共用体。
联合体内部成员的这种特殊的“堆叠”效果,使得联合体有如下基本特征:
联合体的定义:
union?联合体标签
{
????成员1;
????成员2;
????...
};
// 定义了一种称为 union attr 的联合体类型
union?attr
{
????int?x;
????char?y;
????double?z; ?
};
int?main()
{
????// 定义联合体变量
????union?attr n;
}
联合体操作
????????联合体的操作跟结构体形式上别无二致,但由于联合体特殊的存储特性,不管怎么初始化和赋值,最终都有且仅有一个成员是有效的。
// 普通初始化:第一个成员有效(即只有100是有效的,其余成员会被覆盖)
union?attr at = {100, 'k', 3.14};
// 指定成员初始化:最后一个成员有效(即只有3.14是有效的,其余成员会被覆盖)
union?attr at = {
????????????????.x ?= 100,
????????????????.y = 'k',
????????????????.z = 3.14,
};
at.x = 100;
at.y = 'k';
at.z = 3.14; // 只有最后一个赋值的成员有效
printf("%d\n", at.x);
printf("%c\n", at.y);
printf("%lf\n", at.z);
union?attr *p = &at;
p->x = 100;
p->y = 'k';
p->z = 3.14; ?// 只有最后一个赋值的成员有效
printf("%d\n", p->x);
printf("%c\n", p->y);
printf("%lf\n", p->z);
联合体的使用
????????联合体一般很少单独使用,而经常以结构体的成员形式存在,用来表达某种互斥的属性。
struct?node
{
????int?a;
????char?b;
????double?c;
????union?attr at; // at内有三种互斥的属性,非此即彼
};
int?main()
{
????struct?node?n;
????n.at.x = 100; // 使用连续的成员引用符来索引结构体中的联合体成员
}
枚举
????????枚举类型的本质是提供一种范围受限的整型,比如用0-6表示七种颜色,用0-3表示四种状态等,但枚举在C语言中并未实现其本来应有的效果,直到C++环境下枚举才拥有原本该有的属性。
enum?spectrum{red, orange, yellow, green, blue, cyan, purple};
enum?????????{reset, running, sleep, stop};
enum?spectrum color = orange; // 等价于 color = 1
switch(color)
{
????case?red:
????????// 处理红色...
????case?orange:
????????// 处理橙色...
????case?yellow:
????????// 处理黄色... ??
}