程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話 共用體(Union)詳解及示例代碼

C說話 共用體(Union)詳解及示例代碼

編輯:關於C++

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 機,常常應用到的一個實例是: 現有一張關於先生信息和教員信息的表格。先生信息包含姓名、編號、性別、職業、分數,教員的信息包含姓名、編號、性別、職業、教授教養科目。請看上面的表格:


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 表現教員。可以看出,先生和教員所包括的數據是分歧的。如今請求把這些信息放在統一個表格中,並設計法式輸出人員信息然後輸入。

假如把每一個人的信息都看做一個構造體變量的話,那末教員和先生的前 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說話共用體 的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved