C語言 共用體(Union)詳解及示例代碼
通過前面的講解,我們知道結構體(Struct)是一種構造類型或復雜類型,它可以包含多個類型不同的成員。在C語言中,還有另外一種和結構體非常類似的語法,叫做共用體(Union),它的定義格式為:
union 共用體名{
成員列表
};
共用體有時也被稱為聯(lián)合或者聯(lián)合體,這也是 Union 這個單詞的本意。
結構體和共用體的區(qū)別在于:結構體的各個成員會占用不同的內存,互相之間沒有影響;而共用體的所有成員占用同一段內存,修改一個成員會影響其余所有成員。
結構體占用的內存大于等于所有成員占用的內存的總和(成員之間可能會存在縫隙),共用體占用的內存等于最長的成員占用的內存。共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。
共用體也是一種自定義類型,可以通過它來創(chuàng)建變量,例如:
union data{
int n;
char ch;
double f;
};
union data a, b, c;
上面是先定義共用體,再創(chuàng)建變量,也可以在定義共用體的同時創(chuàng)建變量:
union data{
int n;
char ch;
double f;
} a, b, c;
如果不再定義新的變量,也可以將共用體的名字省略:
union data{
int n;
char ch;
double f;
} a, b, c;
共用體 data 中,成員 f 占用的內存最多,為 8 個字節(jié),所以 data 類型的變量(也就是 a、b、c)也占用 8 個字節(jié)的內存,請看下面的演示:
#include <stdio.h>
union data{
int n;
char ch;
short m;
};
int main(){
union data a;
printf("%d, %d\n", sizeof(a), sizeof(union data) );
a.n = 0x40;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.ch = '9';
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.m = 0x2059;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.n = 0x3E25AD54;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
return 0;
}
運行結果:
4, 4
40, @, 40
39, 9, 39
2059, Y, 2059
3E25AD54, T, AD54
這段代碼不但驗證了共用體的長度,還說明共用體成員之間會相互影響,修改一個成員的值會影響其他成員。
要想理解上面的輸出結果,弄清成員之間究竟是如何相互影響的,就得了解各個成員在內存中的分布。以上面的 data 為例,各個成員在內存中的分布如下:
成員 n、ch、m 在內存中“對齊”到一頭,對 ch 賦值修改的是前一個字節(jié),對 m 賦值修改的是前兩個字節(jié),對 n 賦值修改的是全部字節(jié)。也就是說,ch、m 會影響到 n 的一部分數(shù)據(jù),而 n 會影響到 ch、m 的全部數(shù)據(jù)。
上圖是在絕大多數(shù) PC 機上的內存分布情況,如果是 51 單片機,情況就會有所不同:
為什么不同的機器會有不同的分布情況呢?這跟機器的存儲模式有關,我們將在VIP教程《大端小端以及判別方式》一節(jié)中展開探討。
共用體的應用
共用體在一般的編程中應用較少,在單片機中應用較多。對于 PC 機,經常使用到的一個實例是: 現(xiàn)有一張關于學生信息和教師信息的表格。學生信息包括姓名、編號、性別、職業(yè)、分數(shù),教師的信息包括姓名、編號、性別、職業(yè)、教學科目。請看下面的表格:
|
Name
|
Num
|
Sex
|
Profession
|
Score / Course
|
|---|---|---|---|---|
| HanXiaoXiao |
501
|
f
|
s
|
89.5
|
| YanWeiMin |
1011
|
m
|
t
|
math
|
| LiuZhenTao |
109
|
f
|
t
|
English
|
| ZhaoFeiYan |
982
|
m
|
s
|
95.0
|
f 和 m 分別表示女性和男性,s 表示學生,t 表示教師??梢钥闯?,學生和教師所包含的數(shù)據(jù)是不同的?,F(xiàn)在要求把這些信息放在同一個表格中,并設計程序輸入人員信息然后輸出。
如果把每個人的信息都看作一個結構體變量的話,那么教師和學生的前 4 個成員變量是一樣的,第 5 個成員變量可能是 score 或者 course。當?shù)?4 個成員變量的值是 s 的時候,第 5 個成員變量就是 score;當?shù)?4 個成員變量的值是 t 的時候,第 5 個成員變量就是 course。
經過上面的分析,我們可以設計一個包含共用體的結構體,請看下面的代碼:
#include <stdio.h>
#include <stdlib.h>
#define TOTAL 4 //人員總數(shù)
struct{
char name[20];
int num;
char sex;
char profession;
union{
float score;
char course[20];
} sc;
} bodys[TOTAL];
int main(){
int i;
//輸入人員信息
for(i=0; i<TOTAL; i++){
printf("Input info: ");
scanf("%s %d %c %c", bodys[i].name, &(bodys[i].num), &(bodys[i].sex), &(bodys[i].profession));
if(bodys[i].profession == 's'){ //如果是學生
scanf("%f", &bodys[i].sc.score);
}else{ //如果是老師
scanf("%s", bodys[i].sc.course);
}
fflush(stdin);
}
//輸出人員信息
printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");
for(i=0; i<TOTAL; i++){
if(bodys[i].profession == 's'){ //如果是學生
printf("%s\t%d\t%c\t%c\t\t%f\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.score);
}else{ //如果是老師
printf("%s\t%d\t%c\t%c\t\t%s\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.course);
}
}
return 0;
}
運行結果:
Input info: HanXiaoXiao 501 f s 89.5↙
Input info: YanWeiMin 1011 m t math↙
Input info: LiuZhenTao 109 f t English↙
Input info: ZhaoFeiYan 982 m s 95.0↙
Name Num Sex Profession Score / Course
HanXiaoXiao 501 f s 89.500000
YanWeiMin 1011 m t math
LiuZhenTao 109 f t English
ZhaoFeiYan 982 m s 95.000000
以上就是對 C語言共用體 的資料整理,后續(xù)繼續(xù)補充相關資料,謝謝大家對本站的支持!
您可能感興趣的文章
- 04-02c語言函數(shù)調用后清空內存 c語言調用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調用函數(shù)求fibo C語言調用函數(shù)求階乘


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


