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 : 1917853763data.f : 4122360580327794860452759994368.000000data.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 : 10data.f : 220.500000data.str : C Programming

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