C說話 共用體(Union)詳解及示例代碼。本站提示廣大學習愛好者:(C說話 共用體(Union)詳解及示例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話 共用體(Union)詳解及示例代碼正文
經由過程後面的講授,我們曉得構造體(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 機,常常應用到的一個實例是: 現有一張關於先生信息和教員信息的表格。先生信息包含姓名、編號、性別、職業、分數,教員的信息包含姓名、編號、性別、職業、教授教養科目。請看上面的表格:
f 和 m 分離表現女性和男性,s 表現先生,t 表現教員。可以看出,先生和教員所包括的數據是分歧的。如今請求把這些信息放在統一個表格中,並設計法式輸出人員信息然後輸入。
假如把每一個人的信息都看做一個構造體變量的話,那末教員和先生的前 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↙
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說話共用體 的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!