C++中的共用體(union)結構解析與結構體(struct)共用體(union) 的區別
共用體(union)
一、 基礎概念
有時需要使幾種不同型別的變數存放在同一段記憶體單元中。雖然在同一段記憶體中不同資料型別所佔位元組數不同,但都從同一地址開始存放,也就是使用了覆蓋技術,幾個變數互相覆蓋。這種使幾個不同的變數共佔一段記憶體的結構,稱為共同體型別的結構(也稱為聯合型別)。
二、 宣告共用體型別的一般形式:
union 共用體型別名
{
成員表列
};
定義共用體變數的一般形式:
共用體型別名 共用體變數名;
也可以在宣告共用體型別的同時定義共用體變數,也可以沒有共用體型別名直接定義共用體變數。
union data
{
int i;
char ch;
double d;
}a,b,c;
三、 “共用體”與“結構體”區別
結構體變數所佔記憶體長度是各成員佔的記憶體長度之和。每個成員分別佔有其自己的記憶體單元。共用體變數所佔的記憶體長度等於最長的成員的長度。
四、 對共用體變數的訪問方式
不能直接引用共用體變數,只能引用共用體變數中的成員。
a.i; a.ch a.f
不能引用共用體變數:cout<<a;
五、 共用體型別資料的特點
1、 使用共用體變數的目的是希望在同一個記憶體段存放幾種不同型別的資料。注意:在每一瞬時只能存放其中一種,而不是同時存放多種。換句話說,每一瞬時只有一個成員起作用,其他成員不起作用。
2、 能夠訪問的是共用體變數中最後一次被賦值的成員,在對一個新的成員賦值後原有的成員就失去作用。因此在引用共用體變數時應注意當前在共用體變數中起作用的是哪個成員。
3、 共同體變數的地址和它的各成員的地址相同,為同一個地址。
4、 不能對共用體變數名賦值;不能引用變數名來得到一個值;不能在定義共用體變數時對它初始化;不能用共用體變數名作為函式引數。
六、共用體應用舉例
設有若干個人員的資料,其中有學生和老師。學生的資料中包含:姓名、號碼、性別、職業、年級。教師的資料包括:姓名、號碼、性別、職業、職務。可以看出,學生和教師所包含的資料是不同的。要求輸入人緣的資料,然後再輸出。(一個學生一個教師)。
程式如下:
/*
* test4.cpp
*
* Created on: 2012-4-10
* Author: David
*/
#include
#include<string>
#include<iomanip> //因為在輸出流中使用了控制符setw
usingnamespace std;
struct //宣告匿名的結構體
{
int num;
char name[10];
char sex;
char job;
union P //宣告共用體型別
{
int grade; //年級
char position[10]; //職務
}category; //成員category為共用體變數
}person[2]; //定義共用體陣列person,含兩個元素(個人認為就是結構體型別變數)
int main()
{
int i ;
for(i=0;i<2;i++)
{
cin>>person[i].num>>person[i].name>>person[i].sex>>person[i].job;
if(person[i].job=="s")
{
cin>>perosn[i].category.position;
}else if(person[i].job=="t")
{
cin>>person[i].category.position;
}
cout<<endl<<"No.Name sex job grade/position"<<endl;
}
for(i=0;i<2;i++)
{
if(person[i].job=="s")
{
cout<<person[i].num<<setw(6)<<person[i].name<<""<<perosn[i].sex<<""<<person[i].job<<setw(10)<<perosn[i].category.grade<<endl;
}else{
cout<<perosn[i].num<<setw(6)<<person[i].name<<""<<person[i].sex<<" "<<person[i].job<<setw(10)<<person[i].category.position<<endl;
}
}
return 0;
}