共用体类型的数据具有以下几个特点:
(1)同一内存段中可以用来存放不同类型的成员,但是每一瞬间只能存放其中的一种,而不是同时存放。即每一瞬间只有一个成员起作用,其他的成员不起作用。
错误写法:
union Date
{
int i;
char ch;
float f;
}a={1,′a′,1.5};
正确写法:
union Date a={10};
union Date a={.ch=′a′};
对共用体变量初始化只赋一个常量或对指定的一个成员初始化。
(3)共用体变量中起作用的成员是最后一次被赋值的成员,在存入一个新成员后,原有成员就失去作用。
例如:
在执行“a.ch=′c′;a.f=2.0;a.i=4;”语句后,存储单元中最后存放的是4,前两个都被覆盖了。
(4)共用体变量的地址和它的各成员的地址都是同一地址,即“&a.i=&a.ch=&a.f=&a”。
(5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。
例如:
a=1; //不能对共用体变量赋值
x=a; //不能将共用体变量名赋给整型变量x
允许同类型的共用体变量互相赋值:
b=a; //a和b是同类型的共用体变量
(6)以前的C不能把共用体变量作为函数参数,也不能使函数返回共用体变量,但可以使用指向共用体变量的指针,这与结构体指针变量作参数的用法是类似的。Visual C++2010中,共用体变量也可以作为函数的参数和返回值。
(7)共用体定义时,其成员可以包括结构体;结构体定义时,其成员也可以包括共用体,即共用体或者结构体定义时可以相互嵌套。
(8)可以定义共用体数组。
共用体适用于数据处理,可以对同一空间分配不同的内容,如下例所示。
【例8.9】有一张关于教师信息和学生信息的表格。教师的信息包括:工号、姓名、性别、职业、教学科目。学生的信息包括:学号、姓名、性别、职业、成绩。现要求把它们放在同一表格中,如表8-1所示。
表8-1 教师和学生信息表
两类人员数据放在同一张表格中,有一栏不同:对于教师最后一列对应的是教学科目,对于学生则是成绩(对于同一人员不可能同时出现)。现要求把这些信息放在同一表格中,设计程序输入人员信息,然后再输出。为了简化,只设如表8-1所示的两条信息。
如果把每个人的信息都看作一个结构体变量的话,那么教师和学生的前4个成员变量是一样的,第5个成员变量可能是SCORE或者COURSE。当第4个成员变量的值是S的时候,第5个成员变量就是SCORE;当第4个成员变量的值是T的时候,第5个成员变量就是COURSE。经过上面的分析,我们可以设计一个包含共用体的结构体。
程序内容如下:
1 /*这是一个有关于共用体知识讲解的事例程序*/
2 #include<stdio.h>
3 struct //结构体类型定义
4 {int num;
5 char name[10];(www.xing528.com)
6 char sex;
7 char pro;
8 union //共用体类型定义,并定义共用体变量category作为结构体成员
9 {float score;
10 char course[10];
11 }category;
12 }person[2];
13 int main()
14 {
15 int i;
16 for(i=0;i<2;i++){
17 scanf("%d%s%c%c",&person[i].num,person[i].name,&person[i].sex,&person[i].pro);
18 if(person[i].pro==′s′) //如果是学生的信息
19 scanf("%f",&person[i].category.score);
20 else if(person[i].pro==′t′) //否则是教师的信息
21 scanf("%s",person[i].category.course);
22 else
23 printf("input error!");
24 }
25 printf("\n");
26 printf("No.Name SEX PRO COURSE/SCORE\n");
27 for(i=0;i<2;i++)
28 { //输出人员信息
29 if(person[i].pro==′s′)
30 printf("%-6d%-10s%-3c%-3c%-6f\n",person[i].num,person[i].
name,person[i].sex,person[i].pro,person[i].category.score);
31 else
32 printf("%-6d%-10s%-3c%-3c%-6s\n",person[i].num,person[i].
name,person[i].sex,person[i].pro,person[i].category.course);
33 }
34 return 0;
35 }
程序结果如图8.16所示:
图8.16 例8.9程序结果图
在数据处理中,用同一栏目来表示不同内容的情况并不少见,通过这个简单例子可以发现,如果善于利用共用体,会使程序的实现更加简便和灵活。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。