通過前面的講解,我們知道結構體(Struct)是一種構造類型或復雜類型,它可以包含多個類型不同的成員。在C語言中,還有另外一種和結構體非常類似的語法,叫做共用體(Union),它的定義格式為:
union 共用體名{
成員列表
};
共用體有時也被稱為聯合或者聯合體,這也是 Union 這個單詞的本意。
結構體和共用體的區別在于:結構體的各個成員會占用不同的內存,互相之間沒有影響;而共用體的所有成員占用同一段內存,修改一個成員會影響其余所有成員。
結構體占用的內存大于等于所有成員占用的內存的總和(成員之間可能會存在縫隙),共用體占用的內存等于最長的成員占用的內存。共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。
共用體也是一種自定義類型,可以通過它來創建變量,例如:
union data{ int n; char ch; double f;};union data a, b, c;
上面是先定義共用體,再創建變量,也可以在定義共用體的同時創建變量:
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 個字節,所以 data 類型的變量(也就是 a、b、c)也占用 8 個字節的內存,請看下面的演示:
#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 賦值修改的是前一個字節,對 m 賦值修改的是前兩個字節,對 n 賦值修改的是全部字節。也就是說,ch、m 會影響到 n 的一部分數據,而 n 會影響到 ch、m 的全部數據。
上圖是在絕大多數 PC 機上的內存分布情況,如果是 51 單片機,情況就會有所不同:
為什么不同的機器會有不同的分布情況呢?這跟機器的存儲模式有關,我們將在VIP教程《大端小端以及判別方式》一節中展開探討。
共用體的應用
共用體在一般的編程中應用較少,在單片機中應用較多。對于 PC 機,經常使用到的一個實例是: 現有一張關于學生信息和教師信息的表格。學生信息包括姓名、編號、性別、職業、分數,教師的信息包括姓名、編號、性別、職業、教學科目。請看下面的表格:
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 表示教師??梢钥闯?,學生和教師所包含的數據是不同的?,F在要求把這些信息放在同一個表格中,并設計程序輸入人員信息然后輸出。
如果把每個人的信息都看作一個結構體變量的話,那么教師和學生的前 4 個成員變量是一樣的,第 5 個成員變量可能是 score 或者 course。當第 4 個成員變量的值是 s 的時候,第 5 個成員變量就是 score;當第 4 個成員變量的值是 t 的時候,第 5 個成員變量就是 course。
經過上面的分析,我們可以設計一個包含共用體的結構體,請看下面的代碼:
#include <stdio.h>#include <stdlib.h>#define TOTAL 4 //人員總數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亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色偷偷av一区二区三区乱| 日韩精品免费一线在线观看| 69久久夜色精品国产69乱青草| 97国产真实伦对白精彩视频8| 日韩av手机在线看| 欧美激情精品久久久久久| 日韩欧中文字幕| 在线日韩精品视频| 亚洲精品午夜精品| 欧美国产精品日韩| 亚洲男人av在线| 中文字幕亚洲无线码在线一区| 国产精品久久国产精品99gif| 中文字幕久热精品在线视频| 欧美激情视频免费观看| 亚洲视频欧洲视频| 日韩精品中文字幕久久臀| 96sao精品视频在线观看| 欧美日韩在线视频一区| www.日本久久久久com.| 国产日韩综合一区二区性色av| 国产拍精品一二三| 欧美成人免费全部观看天天性色| 亚洲精品成人av| 久久精品国产综合| 成人在线激情视频| 日韩a**站在线观看| 亚洲色图17p| 欧美激情国产日韩精品一区18| 亚洲国产精品网站| 国内外成人免费激情在线视频网站| 91精品国产91久久久久福利| 亚洲欧美日韩精品| 欧美激情久久久| 91伊人影院在线播放| 欧美日韩中文字幕在线| 国产精品第七十二页| 午夜精品国产精品大乳美女| 日韩在线国产精品| 亚洲a一级视频| 亚洲欧美三级伦理| 亚洲深夜福利网站| 欧美专区日韩视频| 欧美整片在线观看| 欧美电影免费观看电视剧大全| 欧美劲爆第一页| 91青草视频久久| 日韩精品一区二区视频| 福利二区91精品bt7086| 性欧美办公室18xxxxhd| 亚洲嫩模很污视频| 深夜福利日韩在线看| 亚洲大尺度美女在线| 国产亚洲视频中文字幕视频| 欧美成人免费在线观看| 久久亚洲精品成人| 亚洲美女av电影| 日韩av第一页| 国产精品日本精品| 欧美成人中文字幕| 国产偷亚洲偷欧美偷精品| 亚洲综合精品伊人久久| 精品国模在线视频| 国产99久久久欧美黑人| 国产精品91免费在线| 亚洲免费视频网站| 日韩在线视频观看正片免费网站| 国产欧美一区二区三区在线| 亚洲欧美激情视频| 91美女福利视频高清| 国产欧美精品在线| 欧洲日本亚洲国产区| 欧洲成人性视频| 亚洲国产精品va在线观看黑人| 国产在线98福利播放视频| 91国产中文字幕| 国产精品吊钟奶在线| 国产精品亚洲欧美导航| 亚洲最新av网址| 日韩欧美成人网| 久久精品国产91精品亚洲| 亚洲男人的天堂在线| 国产成人在线视频| 亚洲天堂网在线观看| 日韩av中文字幕在线免费观看| 久久99视频免费| 成人黄色大片在线免费观看| 亚洲精品动漫100p| 91av福利视频| 欧美大片在线影院| 亚洲欧美日韩另类| 国产精品第10页| 久久综合88中文色鬼| 92国产精品久久久久首页| 精品久久久久久久久久久久久| 久热爱精品视频线路一| 国模gogo一区二区大胆私拍| 美女少妇精品视频| 久久91亚洲精品中文字幕| 亚洲国产精品va在线看黑人| 国产精品丝袜一区二区三区| 日韩毛片在线观看| 国产一区二区三区在线看| 日韩欧美中文字幕在线观看| 成人网欧美在线视频| 精品综合久久久久久97| 成人在线激情视频| 中文字幕不卡av| 51精品国产黑色丝袜高跟鞋| 91在线免费看网站| 日韩在线免费视频观看| 亚洲国产又黄又爽女人高潮的| 日韩av在线免费播放| 国产精品视频区1| 精品日本高清在线播放| 久久精品国产成人精品| 韩国三级日本三级少妇99| 日韩电视剧在线观看免费网站| 亚洲天堂开心观看| 欧美激情手机在线视频| 亚洲乱码一区av黑人高潮| 欧美午夜丰满在线18影院| 98精品在线视频| 色悠悠国产精品| 日韩精品福利在线| 欧美性在线观看| 国产精品欧美日韩| 亚洲精品美女久久| 三级精品视频久久久久| 欧美视频一区二区三区…| 亚洲老头同性xxxxx| 国产97在线|亚洲| 欧美日韩一区二区在线播放| 在线观看欧美成人| 日本国产欧美一区二区三区| 亚洲国产精品小视频| 精品美女久久久久久免费| 美女啪啪无遮挡免费久久网站| 久久在线免费视频| 精品视频久久久| 日韩日本欧美亚洲| 久久久久久久久网站| 国产高清视频一区三区| 中文字幕日韩av| 色狠狠av一区二区三区香蕉蜜桃| 97久久久免费福利网址| 国产精品日韩欧美大师| 久久综合国产精品台湾中文娱乐网| 中文字幕少妇一区二区三区| 在线观看日韩专区| 久久人人爽亚洲精品天堂| 亚洲新声在线观看| 亚洲人成网站在线播| 国产成人亚洲综合91精品| 亚洲天堂久久av| 亚洲黄色成人网| 亚洲男人av在线| 欧美一级片在线播放| 欧美午夜视频一区二区| 久久精品福利视频| 日韩视频精品在线| 亚洲区一区二区| 欧美一级大胆视频| 成人在线中文字幕|