C語言之聯合體Union
共用體是一種特殊的數據類型,允許您在相同的內存位置存儲不同的數據類型。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。共用體提供了一種使用相同的內存位置的有效方式。
定義共用體Union
爲了定義共用體,您必須使用 union 語句,方式與定義結構類似。union 語句定義了一個新的數據類型,帶有多個成員。union 語句的格式如下:
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
union tag 是可選的,每個 member definition 是標準的變量定義,比如 int i; 或者 float f; 或者其他有效的變量定義。在共用體定義的末尾,最後一個分號之前,您可以指定一個或多個共用體變量,這是可選的。
下面定義一個名爲 Data 的共用體類型,有三個成員 i、f 和 str:
union Data
{
int i;
float f;
char str[20];
} data;
現在,Data 類型的變量可以存儲一個整數、一個浮點數,或者一個字符串。這意味着一個變量(相同的內存位置)可以存儲多個多種類型的數據。您可以根據需要在一個共用體內使用任何內置的或者用戶自定義的數據類型。
共用體佔用的內存應足夠存儲共用體中最大的成員。例如,在上面的實例中,Data 將佔用 20 個字節的內存空間,因爲在各個成員中,字符串所佔用的空間是最大的。
訪問共用體成員
爲了訪問共用體的成員,我們使用成員訪問運算符(.)。成員訪問運算符是共用體變量名稱和我們要訪問的共用體成員之間的一個句號。您可以使用 union 關鍵字來定義共用體類型的變量。
下面的實例演示了共用體的用法:
#include <stdio.h>
#include <string.h>
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
union Data data;
//對共用體的錯誤操作
data.i = 10;
data.f = 220.5;
strcpy( data.str, "C Programming");
printf( "data.i : %d\n", data.i);
printf( "data.f : %f\n", data.f);
printf( "data.str : %s\n", data.str);
return 0;
//對共用體的正確操作
data.i = 10;
printf( "data.i : %d\n", data.i);
data.f = 220.5;
printf( "data.f : %f\n", data.f);
strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str);
return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
//錯誤操作的結果
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
//正確操作的結果
data.i : 10
data.f : 220.500000
data.str : C Programming
小結:
共用體的定義和結構體類似,但是本質是對同一款內存的不同操作方式,因爲是同一塊內存的同一時刻只可以給一個變量使用,所以在使用時切記同一時間只能使用共用體中的一個成員!
注:
結構體變量所佔內存長度是其中最大字段大小的整數倍
共用體變量所佔的內存長度等於最長的成員變量的長度。例如,教程中定義的共用體Data各佔20個字節(因爲char str[20]變量佔20個字節),而不是各佔4+4+20=28個字節。
union Data //佔20個字節
{
int i;
float f;
char str[20]; //char str[20]變量佔20個字節
} data;
union Data{ //佔16個字節
int i;
float f;
char str[9]; //佔9個字節
double d; //佔16個字節
}data;
編程時經常會需要判斷機器是大端機還是小端機,此時使用union就非常方便:
union
{
char str;
int data;
};
data=0x01020304;
if(str==0x01)
{
cout<< "此機器是大端!"<<endl;
}
else if(str==0x04){
cout<<"此機器是小端!"<<endl;
}
else{
cout <<" 暫無法判斷此機器類型!"<<endl;
}