最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言 共用體(Union)詳解及示例代碼

 更新時(shí)間:2016年08月24日 10:40:59   投稿:lqh  
本文主要介紹C語(yǔ)言 共用體,這里整理了相關(guān)資料及示例代碼,幫助大家學(xué)習(xí)理解此部分的知識(shí),有興趣的小伙伴可以參考下

通過(guò)前面的講解,我們知道結(jié)構(gòu)體(Struct)是一種構(gòu)造類型或復(fù)雜類型,它可以包含多個(gè)類型不同的成員。在C語(yǔ)言中,還有另外一種和結(jié)構(gòu)體非常類似的語(yǔ)法,叫做共用體(Union),它的定義格式為:

union 共用體名{
    成員列表
};

共用體有時(shí)也被稱為聯(lián)合或者聯(lián)合體,這也是 Union 這個(gè)單詞的本意。

結(jié)構(gòu)體和共用體的區(qū)別在于:結(jié)構(gòu)體的各個(gè)成員會(huì)占用不同的內(nèi)存,互相之間沒(méi)有影響;而共用體的所有成員占用同一段內(nèi)存,修改一個(gè)成員會(huì)影響其余所有成員。

結(jié)構(gòu)體占用的內(nèi)存大于等于所有成員占用的內(nèi)存的總和(成員之間可能會(huì)存在縫隙),共用體占用的內(nèi)存等于最長(zhǎng)的成員占用的內(nèi)存。共用體使用了內(nèi)存覆蓋技術(shù),同一時(shí)刻只能保存一個(gè)成員的值,如果對(duì)新的成員賦值,就會(huì)把原來(lái)成員的值覆蓋掉。

共用體也是一種自定義類型,可以通過(guò)它來(lái)創(chuàng)建變量,例如:

union data{
 int n;
 char ch;
 double f;
};
union data a, b, c;

上面是先定義共用體,再創(chuàng)建變量,也可以在定義共用體的同時(shí)創(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 占用的內(nèi)存最多,為 8 個(gè)字節(jié),所以 data 類型的變量(也就是 a、b、c)也占用 8 個(gè)字節(jié)的內(nèi)存,請(qǐng)看下面的演示:

#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;
}

運(yùn)行結(jié)果:

4, 4
40, @, 40
39, 9, 39
2059, Y, 2059
3E25AD54, T, AD54

這段代碼不但驗(yàn)證了共用體的長(zhǎng)度,還說(shuō)明共用體成員之間會(huì)相互影響,修改一個(gè)成員的值會(huì)影響其他成員。

要想理解上面的輸出結(jié)果,弄清成員之間究竟是如何相互影響的,就得了解各個(gè)成員在內(nèi)存中的分布。以上面的 data 為例,各個(gè)成員在內(nèi)存中的分布如下:

成員 n、ch、m 在內(nèi)存中“對(duì)齊”到一頭,對(duì) ch 賦值修改的是前一個(gè)字節(jié),對(duì) m 賦值修改的是前兩個(gè)字節(jié),對(duì) n 賦值修改的是全部字節(jié)。也就是說(shuō),ch、m 會(huì)影響到 n 的一部分?jǐn)?shù)據(jù),而 n 會(huì)影響到 ch、m 的全部數(shù)據(jù)。

上圖是在絕大多數(shù) PC 機(jī)上的內(nèi)存分布情況,如果是 51 單片機(jī),情況就會(huì)有所不同:

為什么不同的機(jī)器會(huì)有不同的分布情況呢?這跟機(jī)器的存儲(chǔ)模式有關(guān),我們將在VIP教程《大端小端以及判別方式》一節(jié)中展開探討。

共用體的應(yīng)用

共用體在一般的編程中應(yīng)用較少,在單片機(jī)中應(yīng)用較多。對(duì)于 PC 機(jī),經(jīng)常使用到的一個(gè)實(shí)例是: 現(xiàn)有一張關(guān)于學(xué)生信息和教師信息的表格。學(xué)生信息包括姓名、編號(hào)、性別、職業(yè)、分?jǐn)?shù),教師的信息包括姓名、編號(hào)、性別、職業(yè)、教學(xué)科目。請(qǐng)看下面的表格:


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 表示學(xué)生,t 表示教師??梢钥闯?,學(xué)生和教師所包含的數(shù)據(jù)是不同的。現(xiàn)在要求把這些信息放在同一個(gè)表格中,并設(shè)計(jì)程序輸入人員信息然后輸出。

如果把每個(gè)人的信息都看作一個(gè)結(jié)構(gòu)體變量的話,那么教師和學(xué)生的前 4 個(gè)成員變量是一樣的,第 5 個(gè)成員變量可能是 score 或者 course。當(dāng)?shù)?4 個(gè)成員變量的值是 s 的時(shí)候,第 5 個(gè)成員變量就是 score;當(dāng)?shù)?4 個(gè)成員變量的值是 t 的時(shí)候,第 5 個(gè)成員變量就是 course。

經(jīng)過(guò)上面的分析,我們可以設(shè)計(jì)一個(gè)包含共用體的結(jié)構(gòu)體,請(qǐng)看下面的代碼:

#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'){ //如果是學(xué)生
   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'){ //如果是學(xué)生
   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;
}

運(yùn)行結(jié)果:

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

 以上就是對(duì) C語(yǔ)言共用體 的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語(yǔ)言中的操作符優(yōu)先級(jí)的詳細(xì)介紹

    C語(yǔ)言中的操作符優(yōu)先級(jí)的詳細(xì)介紹

    這篇文章主要介紹了C語(yǔ)言中的操作符優(yōu)先級(jí)的詳細(xì)介紹的相關(guān)資料,希望通過(guò)本文能幫助到大家,大家通過(guò)本文能徹底掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • C語(yǔ)言實(shí)現(xiàn)磁盤映射

    C語(yǔ)言實(shí)現(xiàn)磁盤映射

    磁盤映射技術(shù)通過(guò)將文件映射到內(nèi)存中,提高了文件操作的效率,本文就來(lái)介紹一下C語(yǔ)言實(shí)現(xiàn)磁盤映射,感興趣的可以了解一下
    2024-09-09
  • C++移動(dòng)語(yǔ)義介紹與使用講解

    C++移動(dòng)語(yǔ)義介紹與使用講解

    首先,移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā)這兩個(gè)概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來(lái)使用。本篇會(huì)從C++的值類型,到移動(dòng)拷貝與移動(dòng)賦值來(lái)理解移動(dòng)語(yǔ)義與完美轉(zhuǎn)發(fā)
    2022-09-09
  • 深入理解Qt信號(hào)槽機(jī)制

    深入理解Qt信號(hào)槽機(jī)制

    信號(hào)槽是 Qt 框架引以為豪的機(jī)制之一。本文主要介紹了Qt信號(hào)槽機(jī)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++超詳細(xì)講解數(shù)組操作符的重載

    C++超詳細(xì)講解數(shù)組操作符的重載

    C 語(yǔ)言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們探究一下數(shù)組操作符的重載
    2022-06-06
  • C語(yǔ)言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用

    C語(yǔ)言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用

    結(jié)構(gòu)體和聯(lián)合體用于描述事物的屬性,如一只鳥的信息,可能包括它的品種,體重,顏色,年齡等,接下來(lái)大家一起來(lái)詳細(xì)看看吧
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)客房管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)客房管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)客房管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言小游戲之簡(jiǎn)易版三子棋(棋盤可自由擴(kuò)展)

    C語(yǔ)言小游戲之簡(jiǎn)易版三子棋(棋盤可自由擴(kuò)展)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋游戲,還可以自由擴(kuò)展棋盤大小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 使用C語(yǔ)言繪制統(tǒng)計(jì)圖中的餅圖

    使用C語(yǔ)言繪制統(tǒng)計(jì)圖中的餅圖

    常用的統(tǒng)計(jì)圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖,本文主要為大家詳細(xì)介紹了如何使用使用C語(yǔ)言繪制統(tǒng)計(jì)圖中的餅圖,希望對(duì)大家有所幫助
    2024-02-02

最新評(píng)論

宁津县| 阜康市| 弥渡县| 文水县| 手游| 深圳市| 肇东市| 岳普湖县| 赫章县| 西华县| 赤峰市| 荥阳市| 大同县| 土默特右旗| 临湘市| 德阳市| 加查县| 泰州市| 高阳县| 米泉市| 青龙| 酉阳| 商都县| 嘉善县| 舒城县| 北安市| 沂水县| 华蓥市| 邮箱| 大城县| 贵定县| 绥芬河市| 兴城市| 夹江县| 荣成市| 井冈山市| 平昌县| 牙克石市| 阳东县| 微博| 怀远县|