天天看點

【C語言】——union共用體    形式    特點    執行個體    與結構體差別    擴充

    union,C語言中使用比較少的一個東西,其實并不複雜。本質上來說,他和結構體是一樣的,隻是在包裝角度看有些差異。

    形式

    union 共用體名{

    資料類型 成員名;

    資料類型 成員名;

    ...

    }變量名;

    特點

    1.共用體表示幾個變量共用一個記憶體位置,在不同的時間儲存不同的資料類型和不同長度的變量。在union中,所有的共用體成員共用一個空間,并且同一時間隻能儲存其中一個成員變量的值。

    2.union中可以定義多個成員,union的大小由最大的成員的大小決定。

    3.對某一個成員指派,會覆寫其他成員的值。

     當成員所占位元組數不同時,隻會覆寫相應位元組上的值。例:char隻占1個位元組,而int占4個位元組,則char類型資料隻會覆寫int類型資料的低位址1位元組。

    4.聯合體union的存放順序是所有成員都從低位址開始存放的。

     比如0x1234中,0x12是高位址,而0x34是低位址。

    執行個體

    有如下一段程式:

#include <stdio.h>
main()
{
	union
	{
		char c;
		int i;
		float a;
	}test;
	test.i=0x1234;
	test.c='A';
	printf("%x\n",test.i);
}
           

    程式運作結果:1241 

    程式中先給i指派,再給c指派,因為i為int類型,而c為char類型,是以,當在給c指派之後,會指派原來已有的i的值,但又不足以完全覆寫,進而得到運作結果。

    與結構體差別

    1. 共用體和結構體都是由多個不同的資料類型成員組成, 但在任何同一時刻, 共用體隻存放了一個被選中的成員, 而結構體的所有成員都存在。

    2. 對于共用體的不同成員指派, 将會對其它成員重寫, 原來成員的值就不存在了, 而對于結構體的不同成員指派是互不影響的。

    擴充

    union的指派操作涉及到資料所占字元大小的問題,以下是在32位作業系統下的部分資料類型所占位元組:

    1:整形

     int             4位元組

     longint          4位元組

     shortint          2位元組

     unsignedint        4位元組

     unsignedlong int     4位元組

     unsignedshort int    2位元組

    2:字元型

     char          1位元組

     unsignedchar     1位元組

    3:浮點型

     float        4位元組

     double        8位元組

     longdouble      8位元組

     unsigned longdouble  8位元組

     unsigneddouble      4位元組

    4:字元串型

     string     32位元組

    5:指針類型

     所有類型的指針都是   4位元組

    ......

繼續閱讀