共用体类型定义:
使用同一块内存(同一个内存起始地址),存放多个不同类型的变量。使用覆盖技术来实现共用体,但是需要注意的是,同一瞬时一个内存地址只能存放一种变量,共用体变量中只能存放一个值,否则就会被覆盖。共用体变量中起作用的是最后一次(最近一次)被赋值的概念。
定义
union 共用体名{
成员列表
}变量列表
定义方式类似于结构体。
举例:
union Data{
int i;
char ch;
float f;
}a,b,c;
等价于:
union Data{
int i;
char ch;
float f;
};
union Data a,b,c;
引用
a.i;
a.ch;
a.f;
可以在一段程序中全部使用,但是实际上同一瞬时只有一个成员值。
共用体和结构体的区别
结构体变量所占内存长度是全部成员变量的内存长度之和。每个成员有自己分别的内存空间。共用体变量所占内存长度等于最长成员的长度。同一时间只允许被赋给一个成员值。
枚举类型定义
enum [枚举名] {枚举元素列表};
enum 枚举名 枚举变量
例如:
enum Weekday {sun,mon,tue,wed,thu,fri,sat};
0 1 2 3 4 5 6
enum Weekday workday,weekend;
workday=mon; 等价于 workday=1;
weekday=sat; 等价于 weekday=6;
枚举元素在定义后被当作常量处理,因此不能重新赋值。
每一个枚举元素都代表一个整数,枚举变量可以用来作判断和比较。
使用枚举变量
枚举变量完全可以用0123来代替,但是枚举变量的意义在于方便理解。
可以用简单的枚举元素列表,来表示某个值的全部情况。
既可以用作循环中的赋值和边界条件判断,也可以用在switch中,此时case变成了枚举成员(不加” ”).
for(workday=mon;workday<sat;workday++){
//……
}
switch(workday){
case mon:……
case tue:……
//……
}
需要注意的是,枚举变量实际上还是整数,因此输出时不可以%s,只能用%d。