C語言聯合體
聯合體(union)在C語言中是一個特殊的數據類型,能夠存儲不同類型的數據在同一個內存位置。可以定義一個聯合體使用許多成員,但隻有一個部件可以包含在任何時候給定的值。聯合體會提供使用相同的存儲器位置供多用途的有效方式。
定義聯合體
要定義聯合體,必須使用union語句很相似於定義結構。聯合體聲明中定義了一個新的數據類型,程序不止一個成員。聯合體聲明的格式如下:
union [union tag] { member definition; member definition; ... member definition; } [one or more union variables];
union標簽是可選的,每個成員的定義是一個正常的變量定義,如 int i; 和 float f; 或任何其他有效的變量的定義。在聯合體定義的結尾,最後分號之前,可以指定一個或多個變量的聯合,但它是可選的。這裡定義一個名為數據聯合類型有三個成員 i, f, 和 str:
union Data { int i; float f; char str[20]; } data;
現在,數據類型的變量可以存儲的整數,一個浮點數,或字符的字符串。這意味著一個單可變結構即相同的存儲單元可用於存儲多個類型的數據。可以使用任何內置或用戶定義的數據類型根據需要在聯合裡麵。
通過union所占用的內存將大到足以容納聯合體的最大成員。例如,在上麵的例子中的數據類型將占用20個字節的存儲空間,因為這是通過文字串所占用的最大空間。以下將顯示由上述聯合共占用內存大小的例子:
#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; printf( "Memory size occupied by data : %d ", sizeof(data)); return 0; }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Memory size occupied by 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 ", data.i); printf( "data.f : %f ", data.f); printf( "data.str : %s ", data.str); return 0; }
讓我們編譯和運行上麵的程序,這將產生以下結果:
data.i : 1917853763 data.f : 4122360580327794860452759994368.000000 data.str : C Programming
在這裡,我們可以看到,聯合體成員i 和f 值被損壞,因為分配給變量終值已占用的內存位置,如果str成員的值被很好的打印的原因。現在,讓我們來再一次看看同樣的例子,我們將使用一個變量在同一時間,它是聯合體的主要目的:
#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; data.i = 10; printf( "data.i : %d ", data.i); data.f = 220.5; printf( "data.f : %f ", data.f); strcpy( data.str, "C Programming"); printf( "data.str : %s ", data.str); return 0; }
讓我們編譯和運行上麵的程序,這將產生以下結果:
data.i : 10 data.f : 220.500000 data.str : C Programming
這裡,所有的成員都得到打印得非常好,因為一個部件被一次使用。