共用體

在進行某些算法的C語言編程的時候,需要使幾種不同類型的變數存放到同一段記憶體單元中。也就是使用覆蓋技術,幾個變數互相覆蓋。這種幾個不同的變數共同占用一段記憶體的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體。註:在某些書籍中可能稱之為“聯合體”,但是“共用體”更能反映該類型在記憶體的特點。

定義

一般定義形式

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。

相關詞條

熱門詞條

聯絡我們