共用体的概念
有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中。
以上3个变量在内存中占的字节数不同,但都从同一地址开始存放。也就是使用覆盖技术,几个变量 互相覆盖。这种使几个不同的变量共占同一段内存的结构,称为共用体(union)类型的结构(有些书译为联合体)。
共用体的声明和定义
声明共用体类型的一般形式为:
union 共用体类型名
{
成员表列
};
定义共用体变量的一般形式为:
共用体类型名 共用体变量名;
也可在声明共用体类型的同时定义共用体变量,也可没有共用体类型名而直接定义共用体变量:
union data{
int i;
char ch;
double d;
}a,b,c;
union{
int i;
char ch;
double d;
}a,b,c;
“共用体”与“结构体”的定义形式相似。但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。
对共用体变量的访问方式
不能引用共用体变量,而只能引用共用体变量中的成员。例如,下面的引用方式是正确的:
a.i (引用共用体变量中的整型成员i)
a.ch (引用共用体变量中的字符型成员ch)
a.d (引用共用体变量中的双精度型成员d)
不能只引用共用体变量,例如cout«a;是错误的,应该写成cout«a.i;或者cout«a.ch;
共用体类型数据的注意点
1.使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意:在每一瞬时只能存放其中一种,而不是同时存放几种。
2.能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。
3.共用体变量的地址和它的各成员的地址都是同一地址。
4.不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。
#include <stdio.h>
#include <stdlib.h>
union Un{
int a;
char c[3];
};
int main(){
Un A;
A.c[0]=2;
A.c[1]=13;
A.c[2]=255;
//共用体变量的地址和它的各成员的地址都是同一地址
printf("%d %0x\n",A.a,A.a);
system("pause");
}
运行结果:
#include <stdio.h>
#include <stdlib.h>
union Un{
int a;
int b[3];
};
int main(){
Un A;
A.b[0]=0;
A.b[1]=0;
A.b[2]=0;
A.a=6;
//共用体变量的地址和它的各成员的地址都是同一地址
printf("%d %d %d\n",A.b[0],A.b[1],A.b[2]);
system("pause");
}
运行结果: