1. 程式人生 > >真正學會C語言union共用體、聯合體

真正學會C語言union共用體、聯合體

1.C語言共用體的語法

union 共用體名{

    資料型別 成員名;

    資料型別 成員名;

    ...

    }變數名;

2.共用體的特點

共用體(也稱聯合體)所有成員共享同一片儲存區/記憶體。因此聯合變數每個時刻裡只能儲存它的某一個成員的值。

3.共用體的詳細規約

1)共用體是一種幾個變數共用使用同一片記憶體空間的資料結構,在不同的時間儲存不同的資料型別和不同長度的變數。

2)共用體中可以定義多個成員,所分配記憶體空間的大小是由成員所佔記憶體空間的最大資料型別決定。

3)對某一共用體成員進行賦值,可能會覆蓋其他成員的值;當成員所佔位元組數不同時,只會覆蓋相應位元組上的值。

比如:char只佔1個位元組,而int佔4個位元組(windows作業系統),則char型別資料只會覆蓋int型別資料的低地址1位元組。

4)共同體union的存放順序是所有成員都從低地址開始存放的。需要注意的是,這裡所說的存放順序從低地址開始存放指的是成員變數記憶體分佈的存放順序,與作業系統大端和小端無關,無論怎樣,共同體成員都是從低地址開始存放的。舉例如下:

union test
{
    int  a;
    char b;
}coco;

上述共同體的記憶體佈局應該是:

可以看到,int資料型別佔4個位元組,而char資料型別佔1個位元組,故結構體分配的記憶體空間一共是四個位元組;union成員的存放順序是從低地址開始存放的,故成員b只會共用低地址1個位元組的記憶體空間。

4.C語言運用共用體典型示例

#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的值,但又不足以完全覆蓋,從而得到執行結果。

思考:如果是大端規則情況下,執行結果又是什麼?