C 語言 共用體(聯合體)union

幾個不同的變量共享一段內存的結構,稱爲“共用體”類型的結構。

定義共用體類型變量的一般形式爲:

union 共用體名
{
    成員表列
}變量表列;

例如:

union Data
{
    int i;        //表示不同類型的變量i,ch,f可以存放到同一段存儲單元中
    char ch;
    float f;
}a, b, c;        //變量

在地址空間中表示如下圖:

以上3個變量在內存中佔的字節數不同,但都是從同一地址開始(圖中設爲1000)存放,也就是使用覆蓋技術,後一個數據覆蓋了前面的數據。

  共用體類型數據的特點:

(1)同一內存段可以用來存放幾種不同類型的成員,但在每一瞬間只能存放其中一個成員,而不是同時存放幾個。

union Data
{
    int i;        //表示不同類型的變量i,ch,f可以存放到同一段存儲單元中
    char ch;
    float f;
}a, b, c;        //變量
a.i = 97;

表示將整數97存放在共用體變量中,輸出結果如下。

        

97換成16進製爲0x00000061,又因爲電腦的存儲方式爲小端格式,所以在地址中存在的方式如下圖

        

因爲float的存儲方式不同,解碼時會按照獨自的方式計算解碼(可自行搜索float類型數據在內存中的存儲方式),所以輸出爲0.00000。

當a.f = 0x61;時,輸出入下圖:(打印a.ch時,因爲0x0不能用字符打印,所以用的整型,效果一樣)

        

存儲方式爲:

        

所以float類型97存儲的十六進制爲0x42C20000。

(2)可以對共用體變量初始化,但初始化表中只能有一個常量。

union Data
{
    int i;        //表示不同類型的變量i,ch,f可以存放到同一段存儲單元中
    char ch;
    float f;
}a = {1,'a',1.5};              //不能初始化3個成員,他們佔用同一段存儲單元
union Data a = {16};           //正確,對第一個成員初始化
union Data a = {.ch = 'j'};    //C99允許對指定的一個成員初始化

(3)共用體變量中起作用的成員是最後一次被賦值的成員,在對共同體變量中的一個成員賦值後,原有變量存儲單元中的值就被取代。

(4)共用體變量的地址和它的個成員的地址都是同一個地址。例如:&a.i,&a.ch,&a.f都是同一值。

        

(6)共用體類型可以出現結構體類型定義中,也可以定義共用體數組。結構體中也可以出現在共用體類型定義中,數組也可以作爲共用體成員。

用途:

在數據處理中,需要對同一空間安排不同的用途,使用共同體比較方便。

    例:有若干個人員的數據,其中有學生和教師。學生的數據中包括:姓名、號碼、性別、職業、班級。教師的數據包括:姓名、號碼、性別、職業、職務。要求用同一表格來處理。

    可以看出:學生和老師的數據的項目大多數是相同的,只有一個不同,學生的班級,教師的職位。

struct{
    int num;          //成員 編號
    char name[10];    //成員 姓名
    char sex;         //成員 性別
    union{            //聲明無名共用體類型
        int class;    //成員 班級
        char position[10];//成員 職務
    }category;
}person[2];

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章