1. 程式人生 > >union 共用體 聯合體

union 共用體 聯合體

 共用體表示幾個變數共用一個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在union中,所有的共用體成員共用一個空間,並且同一時間只能儲存其中一個成員變數的值。
1. 共用體宣告和共用體變數定義
其形式為:
  union 共用體名{
  資料型別 成員名;
  資料型別 成員名;
  ...
  } 變數名;
下例表示宣告一個共用體foo:
  union foo{
  int i;
  char c;
  double k;
  };
  再用已宣告的共用體可定義共用體變數。
  例如用上面說明的共用體定義一個名為bar的共用體變數, 可寫成:
  union foo bar;
  在共用體變數bar中, 整型變數i和字元變數c共用同一記憶體位置。
  當一個共用體被宣告時, 編譯程式自動地產生一個變數, 其長度為聯合中最大的變數長度的整數倍。以上例而言,最大長度是double資料型別,所以foo的記憶體空間就是double型的長度。
  union foo
  {
  char s[10];
  int i;
  };
  在這個union中,foo的記憶體空間的長度為12,是int型的3倍,而並不是陣列的長度10。若把int改為double,則foo的記憶體空間為16,是double型的兩倍。
   另外要注意的是,union的成員不可以為靜態、引用,如果是自訂型態的話,該自訂型態成員不可以有建構函式、解構函式或是複製指定運運算元。
 2. 共用體和結構體的區別
  共用體和結構體有下列區別:
  1. 共用體和結構體都是由多個不同的資料型別成員組成, 但在任何同一時刻, 共用體只存放了一個被選中的成員, 而結構體的所有成員都存在。
  2. 對於共用體的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於結構體的不同成員賦值是互不影響的。


設有以下說明和定義:
 typedef union {long i; int k[5]; char c;} DATE;
 struct data { int cat; DATE cow; double dog;} too; 
DATE max;
 則語句 printf("%d",sizeof(too)+sizeof(max));
的執行結果是:______ 
答案:DATE是一個union, 變數公用空間. 裡面最大的變數型別是int[5], 佔用20個位元組. 所以它的大小是20 data是一個struct, 每個變數分開佔用空間. 依次為int4 + DATE20 + double8 = 32. 所以結果是 20 + 32 = 52. 當然...在某些16位編輯器下, int可能是2位元組,那麼結果是 int2 + DATE10 + double8 = 20