首页 理论教育 C语言程序设计|共用体类型数据的特点

C语言程序设计|共用体类型数据的特点

时间:2023-10-29 理论教育 版权反馈
【摘要】:共用体类型的数据具有以下几个特点:同一内存段中可以用来存放不同类型的成员,但是每一瞬间只能存放其中的一种,而不是同时存放。可以定义共用体数组。共用体适用于数据处理,可以对同一空间分配不同的内容,如下例所示。

C语言程序设计|共用体类型数据的特点

共用体类型的数据具有以下几个特点:

(1)同一内存段中可以用来存放不同类型的成员,但是每一瞬间只能存放其中的一种,而不是同时存放。即每一瞬间只有一个成员起作用,其他的成员不起作用。

(2)可以对共用体变量初始化,但初始化表中只能有一个常量。

错误写法:

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程序结果图

在数据处理中,用同一栏目来表示不同内容的情况并不少见,通过这个简单例子可以发现,如果善于利用共用体,会使程序的实现更加简便和灵活。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈