共用體(union)是一種資料格式,它能夠儲存不同型別的資料,但是隻能同時儲存其中的一種型別。
工具/原料
Microsoft Visual Studio 2012(或其他版本)
一、共用體的宣告
共用體的語法和結構體的類似,共用體宣告格式如下:
union uninType
{
int fourByte;
char oneByte[4];
};
定義結構後,就可以建立這種型別的變量了:
uninType Test1;
uninType Test2;
等
二、共用體的使用1
假如有定義:
uninType Test;
test.fourByte=2;
則
cout << (int)test.oneByte[0] << endl;
會輸出顯示什麼?這裡涉及到儲存大小端模式的問題,答案見步驟2
有如下程式碼:
test.fourByte=2;
cout << (int)test.oneByte[0] << endl;
if (test.oneByte[0] == 2)
cout << "Little endian!" << endl;
else
cout << "Big endian!" << endl;
這個程式碼能測試CPU的大小端模式,我使用Intel CORE i3,win7 OS得到輸出如下:
2
Little endian!
三、共用體的使用2
在嵌入式系統開發中,有時需要將一些變數儲存在EEPROM中,變數型別若是char、int就很好辦,可是如果要儲存float、double型別的變數怎麼辦呢?
這個問題可以用共用體解決:
union myfloat
{
char i[4];
float j;
}Test;
因為float是四個位元組,因此我們定義一個4個元素的char陣列和float公用一段記憶體,接下來就是EEPROM存取了
在程式中要使用 j 的地方使用Test.j就行了,
想把 j 存入EEPROM可以這樣:
EEPROM_WRITE(0,myfloat.i[0]);
EEPROM_WRITE(1,myfloat.i[1]);
EEPROM_WRITE(2,myfloat.i[2]);
EEPROM_WRITE(3,myfloat.i[3]);
注:上面引數0、1、2、3為EEPROM地址,上面的EEPROM_WRITE只是示意,有時需要對地址使用(void*)進行型別轉換
想把 j 從EEPROM讀出可以這樣:
myfloat.i[0]=EEPROM_READ(0);
myfloat.i[1]=EEPROM_READ(1);
myfloat.i[2]=EEPROM_READ(2);
myfloat.i[3]=EEPROM_READ(3);
然後在程式中繼續使用Test.j就可以了
是不是很簡單呢
注意事項
共用體常用來節省記憶體,特別是一些嵌入式程式設計,記憶體是非常寶貴的!
共用體也常用於作業系統資料結構或硬體資料結構!