C 共用體

C 共用體

共用體是一種特殊的資料型別,允許您在相同的記憶體位置儲存不同的資料型別。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。共用體提供了一種使用相同的記憶體位置的有效方式。

定義共用體

為了定義共用體,您必須使用 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 個位元組的記憶體空間,因為在各個成員中,字串所佔用的空間是最大的。下面的例項將顯示上面的共用體佔用的總記憶體大小:

例項

#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\n", 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\n", data.i); printf( "data.f : %f\n", data.f); printf( "data.str : %s\n", data.str); return 0; }

當上面的程式碼被編譯和執行時,它會產生下列結果:

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

在這裡,我們可以看到共用體的 if 成員的值有損壞,因為最後賦給變數的值佔用了記憶體位置,這也是 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\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 : 10
data.f : 220.500000
data.str : C Programming

在這裡,所有的成員都能完好輸出,因為同一時間只用到一個成員。