9.5 共用体类型
9.5.1 什么是共用体类型
有时想用同一个内存单元存放不同的类型的变量。例如,把一个int变量 ,char变量和float变量放在同一个地址开始的内存单元中。
定义共用体类型变量的一般形式为:
union 共用体名
{
成员表列
}变量表列;
union Data { //表示不同的类型a,b,c存放在同一段存储单元中
int a;
char b;
float c;
}m,n; //在声明类型时同时定义变量
union Data {
int a;
char b;
float c;
}; //先声明定义共用体类型
union Data m, n; //声明定义共用体变量m,n;
结构体变量所占的字节是各个成员占的内长长度之和。每个成员都有自己的内存单元。
而共用体变量所占的内存长度等于最长的成员的长度。例如,上面定义的共用体变量a,b,c各占4个字节(因为一个float型变量占4个字节)。
9.5.2 引用共用体变量的方式
只用定义了共用体变量才能引用它,但应该注意,不能引用共用体变量,而只能引用共用体变量中的成员。例如,前面定义了m,n为共用体变量,下面引用方式是正确的:
m.a
m.b
m.c
n.a
n.b
n.c
9.5.3 共用体类型数据的特点
同一个内存段可以用来存放几种不同类型的成员,但在每一个瞬时只能能存放其中一个成员,而不是同时存放几个。
可以对公用体变量初始化,但初始化表中只能有一个常量。
union Date{ int i; char ch; float fl; }a = {1,'s',23.3}; //这种情况用法不对,错误
union Data a = {16} //正确 ,对第一个成员初始化 union Data a = {.char ='c'};正确,对指定的成员初始化。
3.共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有的存储单元中的值被取代。如果执行下面的语句
a.ch = 'c'; a.f = 1.5; a.i = 123;
在完成以上3个赋值运算以后,变量存储单元存放的是最后存入的123;原来的'c'和1.5都被覆盖了
. 4.共用体变量地址和它的各个成员地址都是同一个地址。
5.不能对共用体变量名赋值,也不能企图引用共用体变量来得到一个值。
6.共用体变量名不能作为函数参数,但可以使用指向共用体变量的指针作为函数参数。
7.共用体类型可以出现结构体类型定义中,数组也可以作为共用体的成员。
9.6 使用枚举类型
如果一个变量只有几种可能的值,则可以定义为枚举类型,所谓枚举就是把可能的值一 一列举出来,变量的值只限于列举出来的值的范围内。
声明枚举类型用enum开头。例如
enum Weekday{sun,mon,tue,wed,thu,fri,sat};
上面声明了一个枚举类型enum Weekday。然后可以用该枚举类型来定义变量。例如:
enum Weekday workday, weekend;
workday 和weekend被定义为枚举类型,花括号中的sun,mon,...,sat称为枚举元素或枚举常量。
声明枚举类型的一般形式:
enum [枚举名]{枚举元素列表};
说明:
- 枚举元素按常量处理,故称枚举常量。不是因为它们是标志符而把它们看作变量,不能对他们赋值.
- 每一个枚举元素都代表一个整数,C语言编译器按定义顺序默认它们的值为0,1,2,3,4,5....。在上面定义中,sum自动为0,mon为1,。。。,sat的值为6。如果自定枚举常量sum的值为7.mon为1,以后顺序加1,sat为6。
- 枚举元素可以用来作判断比较。