C++中的共用体(union)结构解析与结构体(struct)共用体(union) 的区别
共用体(union)
一、 基础概念
有时需要使几种不同类型的变量存放在同一段内存单元中。虽然在同一段内存中不同数据类型所占字节数不同,但都从同一地址开始存放,也就是使用了覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占一段内存的结构,称为共同体类型的结构(也称为联合类型)。
二、 声明共用体类型的一般形式:
union 共用体类型名
?{
???? 成员表列
};
定义共用体变量的一般形式:
共用体类型名 共用体变量名;
也可以在声明共用体类型的同时定义共用体变量,也可以没有共用体类型名直接定义共用体变量。
union?data
{
int?i;
char?ch;
double?d;
}a,b,c;
三、 “共用体”与“结构体”区别
结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。
四、 对共用体变量的访问方式
不能直接引用共用体变量,只能引用共用体变量中的成员。
a.i;?????? a.ch??????? a.f
不能引用共用体变量:cout<<a;
五、 共用体类型数据的特点
1、???使用共用体变量的目的是希望在同一个内存段存放几种不同类型的数据。注意:在每一瞬时只能存放其中一种,而不是同时存放多种。换句话说,每一瞬时只有一个成员起作用,其他成员不起作用。
2、???能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。因此在引用共用体变量时应注意当前在共用体变量中起作用的是哪个成员。
3、???共同体变量的地址和它的各成员的地址相同,为同一个地址。
4、???不能对共用体变量名赋值;不能引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。
六、共用体应用举例
设有若干个人员的数据,其中有学生和老师。学生的数据中包含:姓名、号码、性别、职业、年级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。要求输入人缘的数据,然后再输出。(一个学生一个教师)。
程序如下:
?
/*
?* test4.cpp
?*
?*? Created on: 2012-4-10
?*? ? ? Author:?David
?*/
?
#include?<iostream>
#include?<string>
#include?<iomanip>??//因为在输出流中使用了控制符setw
using?namespace?std;
struct? ? ? ? ? ? ? ??//声明匿名的结构体
{
int?num;
char?name[10];
char?sex;
char?job;
union?P? ? ? ? ? ? ??//声明共用体类型
{
int?grade; ? ? ??//年级
char?position[10];?//职务
}category; ? ? ??//成员category为共用体变量
}person[2]; ? ? ? ??//定义共用体数组person,含两个元素(个人认为就是结构体类型变量)
?
int?main()
{
int?i ;
for(i=0;i<2;i++)
{
cin>>person[i].num>>person[i].name>>person[i].sex>>person[i].job;
if(person[i].job=="s")
{
cin>>perosn[i].category.position;
}else?if(person[i].job=="t")
{
cin>>person[i].category.position;
}
cout<<endl<<"No.Name sex job grade/position"<<endl;
}
?
for(i=0;i<2;i++)
{
if(person[i].job=="s")
{
cout<<person[i].num<<setw(6)<<person[i].name<<""<<perosn[i].sex<<""<<person[i].job<<setw(10)<<perosn[i].category.grade<<endl;
}else{
cout<<perosn[i].num<<setw(6)<<person[i].name<<""<<person[i].sex<<" "<<person[i].job<<setw(10)<<person[i].category.position<<endl;
}
}
return?0;
}