- UID
- 799481
|
§10.8 共用体 一、共用体的概念
当需要把不同类型的变量存放到同一段内存单元,或对同一段内存单元的数据按不同类型处理,则需要使用“共用体”数据结构。
例、把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。
共用体的定义形式:
union 共用体名
{
成员列表;
}变量列表;
例、
union data
{
int i;
char ch;
float f;
}
|
| 注意区分:
“共用体”:各成员占相同的起始地址,所占内存长度等于最长的成员所占内存。
“结构体”:各成员占不同的地址,所占内存长度等于全部成员所占内存之和。
二、共用体变量的引用
只能引用共用体变量的成员,如、
union data a;
a.i;
a.ch;
a.f;
三、共用体类型数据的特点
1、共用体变量中的值是最后一次存放的成员的值,如、
a.i = 1;
a.ch = 'a';
a.f = 1.5;
完成以上三个赋值语句后,共用体边量的值是1.5,而a.i=1和a.ch='a'已无意义。
2、共用体变量不能初始化,例、
union data
{
int i;
char ch;
float f;
}a={1,'a', 1.5};
[例10.11] 设有若干个人员的数据,其中有学生和教师。学生数据包括:姓名、号码、性别、职业、班级。教师数据包括:姓名、号码、性别、职业、职务。如图、
要求输入人员数据,然后输出。
分析:学生数据的class(班级)和教师数据的position(职务)类型不同,但在同一表格中,使用“共用体”数据结构。
struct
{
int num;
char name[10];
char sex;
char job;
union
{
int class; /* 班级 */
char position[10]; /* 职务 */
}category;
}person[2]; /* 2个人员数据 */
void main()
{
int i;
for(i=0;i<2;i++) /* 输入2个人员的数据 */
{
scanf("%d %s %c %c", &person.num, &person.name,
&person.sex, &person.job);
if(person.job == 'S') /* 学生 */
scanf("%d", &person.category.class); /* 输入班级 */
else if(person.job == 'T') /* 教师 */
scanf("%s", person.category.position); /* 输入职务 */
else
printf("Input error!");
}
printf("\n");
printf("No. name sex job class/position\n");
for(i=0;i<2;i++) /* 输出 */
{
if (person.job == 'S')
printf("%-6d%-10s%-3c%-3c%-6d\n",person.num, person.name,
person.sex, person.job, person.category.class);
else
printf("%-6d%-10s%-3c%-3c%-6s\n",person.num, person.name,
person.sex, person.job, person.category.position);
}
}
§10.9 枚举类型 如果一个变量只有几种可能的值,可以定义为枚举类型。
“枚举”:将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。
用关键字enum定义枚举类型:例、
enum weekday {sun, mon, tue, wed, thu, fri, sat};
weekday是枚举类型名,可以用于定义变量,如、
enum weekday workday, week_end;
定义了两个枚举变量:workday,week_end, 它们只能取sun到sat之一,如、
weekday = mon;
week_end = sun;
sun、mon、....、sat称为“枚举元素”或“枚举常量”。
说明:
1、枚举元素是常量。在C编译器中,按定义的顺序取值0、1、2、...。
例、
weekday = mon;
printf("%d", weekday); 输出整数1。
2、枚举元素是常量,不是变量,因此不能赋值。
sun = 0; mon = 1;
但在定义枚举类型时,可以指定枚举常量的值,如、
enum weekday {sun=7, mon=1, tue, wed, thu, fri, sat};
此时,tue、wed、...的值从mon的值顺序加1。如,tue=2。
3、枚举值可以作判断,例、
if (weekday == mon)....
if (weekday > sun)....
4、整型与枚举类型是不同的数据类型,不能直接赋值,如、
workday = 2; /* workday是枚举类型 */
但可以通过强制类型转换赋值,如、
workday = (enum weekday)2;
[例10.12] 口袋里有红、黄、蓝、白、黑五种颜色的球若干个。每次从口袋中取出三个球,打印出三种不同颜色球的可能取法。
分析:球的颜色只可能取五种值,用枚举类型变量处理。
#i nclude "stdio.h"
void main()
{
enum color {red, yellow, blue, white, black}; /* 枚举类型 */
enum color i,j,k,pri;
int n,loop;
n = 0; /* 不同颜色的组合序号 */
for(i=red; i<=black; i++)
for(j=red; j<=black; j++)
if (i != j)
{
for(k=red; k<=black; k++)
if ((k != i) && (k != j))
{
n = n + 1;
printf("%-4d",n); /* 组合序号 */
for(loop = 1;loop<=3; loop++) /* 循环输出三个球的颜色 */
{
switch(loop)
{
case 1: pri = i; break; /* 第1个球 */
case 2: pri = j; break; /* 第2个球 */
case 3: pri = k; break; /* 第3个球 */
default: break;
}
switch(pri)
{
case red: printf("%-10s","red"); break;
case yellow: printf("%-10s","yellow"); break;
case blue: printf("%-10s","blue"); break;
case white: printf("%-10s","white"); break;
case black: printf("%-10s","black"); break;
default: break;
}
}
printf("\n");
}
}
printf("\n total:%5d\n", n);
|
|
|