定義
一般定義形式
union 共用體名
{
成員表列
} 變數表列;
簡單示例
引用方式
只有先定義了共用體變數才能在後續程式中引用它,有一點需要注意:不能引用共用體變數,而只能引用共用體變數中的成員。
簡單示例
對於這裡定義的共用體變數a,b,c。下面的引用方式是正確的:
a.i (引用共用體變數中的整型變數i)
a.ch (引用共用體變數中的字元變數ch)
a.f (引用共用體變數中的實型變數f)
而不能引用共用體變數,例如:
printf("%d",a); <==這種用法是錯誤的。
因為a的存儲區內有好幾種類型的數據,分別占用不同長度的存儲區,這些共用體變數名a,難以使系統確定究竟輸出的是哪一個成員的值。
而應該寫成
或
數據的特點
1.同一個記憶體段可以用來存放幾種不同類型的成員,但是在每一瞬間只能存放其中的一種,而不是同時存放幾種。換句話說,每一瞬間只有一個成員起作用,其他的成員不起作用,即不是同時都在存在和起作用。
2.共用體變數中起作用的成員是最後一次存放的成員,在存入一個新成員後,原有成員就失去作用。
3.共用體變數的地址和它的各成員的地址都是同一地址。
4.不能對共用體變數名賦值,也不能企圖引用變數名來得到一個值。
5.共用體類型可以出現在結構體類型的定義中,也可以定義共用體數組。反之,結構體也可以出現在共用體類型的定義中,數組也可以作為共用體的成員。
6.共用體變數的初始化 。
(1)union data a=b; //把共用體變數初始化為另一個共用體
(2)union data a={123}; //初始化共用體為第一個成員
(3)union data a={.ch="a"}; //指定初始化項目,按照C99標準
7.共用體變數也可以作為函式的參數和返回值。
雖然很多教材上都說不可以,但是,至少VC++6.0都已經支持了,以下程式用於驗證:
使用範例
例如:
共用體不同於結構體,會共有一處空間,對於其中一個成員的賦值,會影響到另一個成員,因此雖然是對data1.a++ (表示該值加1,由於該值共用data1.b,也即是 'A' +1 ,將會將字元A變為其ASCII碼再加1,也即是B)。所以最終結果是B。