共用體的定義與應(yīng)用詳細(xì)解析
定義:
使用覆蓋技術(shù),幾個(gè)變量相互覆蓋,從而使幾個(gè)不同變量共占同一段內(nèi)存的結(jié)構(gòu),成為共同體類型的結(jié)構(gòu)。
共同體的定義類似結(jié)構(gòu)體,不過共同體的所有成員都在同一段內(nèi)存中存放,起始地址一樣,并且同一時(shí)刻只能使用其中的一個(gè)成員變量。
聲明共用體的一般形式為:
union 共用體類型名
{
成員列表
};
定義共用體變量的一般形式為:
共用體類型名 共用體變量名;
例如:
union data{
int i;
char ch;
double d;
};
data a,b,c;
或者
union{
int i;
char ch;
double d;
};
data a,b,c;
結(jié)構(gòu)體變量所占長度是各成員占的內(nèi)存長度之和。每個(gè)成員分別占有自己的內(nèi)存單元。共用體變量所占的內(nèi)存長度等于最長的成員的長度。
共用體的使用
1.不能應(yīng)用共用體變量,而只能引用共用體變量中的成員。
例如:
cout<<a.i;
cout<<a.ch;
2.使用共用體變量的目的是希望通過統(tǒng)一內(nèi)存段存放幾種不同類型的數(shù)據(jù)。
但是要注意,每一瞬間只能存放一種,而不是存放集中。并且,如果對(duì)新的成員變量的話,原來的成員變量的值就被覆蓋了。
#include<iostream>
using namespace std;
int main(){
union data{
char a;
char b;
};
data qianshou;
qianshou.a='q';
cout<<qianshou.a<<endl;
qianshou.b='m';
cout<<qianshou.a<<endl;
return 0;
}
后來,我們對(duì)共用體中的成員b進(jìn)行了賦值,結(jié)果我們輸出的是成員a,輸出的是b的值,所以證明它們是公用地址的。
3.不能對(duì)共用體變量名賦值,不能企圖引用變量名來得到一個(gè)值;不能在定義共用體變量時(shí)對(duì)它初始化,不能用共用體變量名作為函數(shù)參數(shù)。
一個(gè)共同體的實(shí)例:
設(shè)有若干個(gè)人員的數(shù)據(jù),其中有學(xué)生和老師。學(xué)生的數(shù)據(jù)包括:姓名,編號(hào),性別,職業(yè),年級(jí)。老師的數(shù)據(jù)包括:姓名,編號(hào),性別,職業(yè),職務(wù)。可以看出,學(xué)生和老師所包含的數(shù)據(jù)是不同的。先要求把他們放在同一個(gè)表格中:
要求設(shè)計(jì)程序輸入人員信息然后輸出。
如果把每個(gè)人都看作一個(gè)結(jié)構(gòu)體變量的話,可以看出老師和學(xué)生的前4個(gè)成員變量是一樣的,并且第五個(gè)成員變量可能是class或者position,當(dāng)?shù)谒膫€(gè)成員變量是s的時(shí)候,第五個(gè)成員變量就是class;當(dāng)?shù)谒膫€(gè)成員變量是t的時(shí)候,第五個(gè)成員變量就是position。
#include<iostream>
#include<string>
using namespace std;
int main(){
struct{
string name;
string num;
char sex;
char job;
union{
char grade[5];
char position[5];
}p;//定義了一個(gè)共同體變量
}person[2];//定義了一個(gè)結(jié)構(gòu)體數(shù)組變量
int i=0;
cout<<"name\tnum\tsex\tjob\tclass/position"<<endl;
for(;i<2;i++){
cin>>person[i].name>>person[i].num>>person[i].sex>>person[i].job;
if(person[i].job=='s')cin>>person[i].p.grade;
else cin>>person[i].p.position;
}
i=0;
cout<<"===========show data==========="<<endl;
for(;i<2;i++){
cout<<person[i].name<<"\t";
cout<<person[i].num<<"\t";
cout<<person[i].sex<<"\t";
cout<<person[i].job<<"\t";
if(person[i].job=='s')cout<<person[i].p.grade<<endl;
else cout<<person[i].p.position<<endl;
}
cout<<endl;
return 0;
}
上一篇:c++ builder TreeView控件節(jié)點(diǎn)遍歷代碼
欄 目:C語言
本文標(biāo)題:共用體的定義與應(yīng)用詳細(xì)解析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4206.html
您可能感興趣的文章
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10c語言求1+2+...+n的解決方法
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10c語言 跳臺(tái)階問題的解決方法
- 01-10如何判斷一個(gè)數(shù)是否為2的冪次方?若是,并判斷出來是多少次方


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery