2.3.6 共用体类型
共用体类型和结构体类型,都是由不同的数据类型所组成的,区别是结构体类型的变量是分别存放的,而共用体类型的变量是存放在同一段内存空间的。这段内存空间的大小由共用体中成员的类型决定,占据内存空间最大的成员所占的字节数就是共用体变量所占的字节数。
共用体变量同样需要声明后才能用,而且不能直接引用共用体变量,只能引用共用体变量中的成员。共用体变量的声明如下。
- 01 union employees
- 02 {
- 03 int id;
- 04 char name[20];
- 05 };
- 06 employees emp;
在使用共用体时应注意以下几点。
同一段内存空间可以用来存放几种不同数据类型的成员,但在同一时间只能存放其中的一种,不能同时存放几种。即同一时间只有一个成员起作用。
共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有的成员就会被覆盖,从而失去作用。
共用体变量的地址和它的各成员的地址都是同一个地址。
不能对共用体变量赋值,也不能在声明共用体变量时对它进行初始化。
不能把共用体变量作为参数,也不能使函数返回共用体变量,但可以使用指向共用体变量的指针。
共用体变量可以出现在结构体类型声明中,也可以声明共用体数组。
【例2.5】 声明一个共用体类型变量,并对该变量进行赋值、输入和输出,程序代码如下。(实例位置:光盘\mr\example\第2章\2.5)
代码位置:光盘\mr\example\第2章\2.5\union\union.cpp
- 01 #include "iostream.h"
- 02 #include "iomanip"
- 03 #include "cstring"
- 04 struct employees
- 05 {
- 06 int id;
- 07 char name[20];
- 08 char work[20];
- 09 union
- 10 {
- 11 int classes;
- 12 char position[10];
- 13 }xuanze;
- 14 };
- 15 int main()
- 16 {
- 17 employees emp[2];
- 18 int i;
- 19 for(i=0;i<2;i++)
- 20 {
- 21 cout<<"输入emp["<<i<<"]数据:"<<"\n";
- 22 cout<<"编号:";
- 23 cin>>emp[i].id;
- 24 cout<<"姓名:";
- 25 cin>>emp[i].name;
- 26 cout<<"工作:";
- 27 cin>>emp[i].work;
- 28 if(!strcmp(emp[i].work,"学生"))
- 29 {
- 30 cout<<"教室:";
- 31 cin>>emp[i].xuanze.classes;
- 32 }
- 33 else if(!strcmp(emp[i].work,"教师"))
- 34 {
- 35 cout<<"职称:";
- 36 cin>>emp[i].xuanze.position;
- 37 }
- 38 else
- 39 {
- 40 cout<<"工作请添加学生或教师!"<<"\n";
- 41 exit(1);
- 42 }
- 43 }
- 44 for(i=0;i<2;i++)
- 45 {
- 46 cout<<"输出emp["<<i<<"]数据:"<<"\n";
- 47 cout<<"编号:"<<emp[i].id<<"\n";
- 48 cout<<"姓名:"<<emp[i].name<<"\n";
- 49 cout<<"工作:"<<emp[i].work<<"\n";
- 50 if(!strcmp(emp[i].work,"学生"))
- 51 {
- 52 cout<<"教室:"<<emp[i].xuanze.classes<<"\n";
- 53 }
- 54 else if(!strcmp(emp[i].work,"教师"))
- 55 {
- 56 cout<<"职称:"<<emp[i].xuanze.position<<"\n";
- 57 }
- 58 }
- 59 }
运行结果如图2.5所示。
|
| 图2.5 运行结果 |
试一试:根据以上程序,声明一个关于医生护士的共用体类型,并定义一个此共用体类型的变量,对该变量进行赋值、输入和输出。