union ***用體名
{成員表列};
union data
{
int a ;
float b;
doublec;
chard;
}obj;
該形式定義了壹個***用體數據類型union data ,定義了***用體數據類型變量obj。***用體數據類型與結構體在形式上非常相似,但其表示的含義及存儲是完全不同的。先讓我們看壹個小例子。
union data /****用體*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*結構體* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
運行程序輸出:
15,8
程序的輸出說明結構體類型所占的內存空間為其各成員所占存儲空間之和。而形同結構體的***用體類型實際占用存儲空間為其最長的成員所占的存儲空間。
對***用體的成員的引用與結構體成員的引用相同。但由於***用體各成員***用同壹段內存空間,使用時,根據需要使用其中的某壹個成員。從圖中特別說明了***用體的特點,方便程序設計人員在同壹內存區對不同數據類型的交替使用,增加靈活性,節省內存。
可以引用***用體變量的成員,其用法與結構體完全相同。若定義***用體類型為:
union data /****用體*/
{
int a;
float b;
double c;
char d;
}mm;
其成員引用為:mm.a,mm.b,mm.c,mm.d 但是要註意的是,不能同時引用四個成員,在某壹時刻,只能使用其中之壹的成員。
main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
運行程序輸出為:
6
6 7.2
3 4.2,=
程序最後壹行的輸出是我們無法預料的。其原因是連續做mm.d='W';mm.b=34.2;兩個連續的賦值語句最終使***用體變量的成員mm.b所占四字節被寫入34.2,而寫入的字符被覆蓋了,輸出的字符變成了符號“ =”。事實上,字符的輸出是無法得知的,由寫入內存的數據決定。
例子雖然很簡單,但卻說明了***用體變量的正確用法。