C語言的聯(lián)合(union)與枚舉(enum)

聯(lián)合(union)

聯(lián)合(union)在許多其他語言中被稱為變體記錄(variant record)。它的外表與結(jié)構(gòu)體相似礁芦,但在內(nèi)存布局上存在關(guān)鍵性的區(qū)別犀忱。在結(jié)構(gòu)體中,每個成員依次存儲彭沼,而在聯(lián)合中,所有的成員都從偏移地址零開始存儲备埃。這樣姓惑,每個成員的位置都重疊在一起;在某一時刻按脚,只有一個成員真正存儲于該地址于毙。

聯(lián)合既有一些優(yōu)點,也有一些缺點辅搬。它的缺點就是那些所謂的優(yōu)點其實并不怎么出色唯沮。聯(lián)合的優(yōu)點是它的外觀同結(jié)構(gòu)體一樣,只是用關(guān)鍵字union取代了關(guān)鍵字struct堪遂。所以介蛉,如果你對結(jié)構(gòu)體的一切都已了如指掌,基本上也就掌握了聯(lián)合溶褪。聯(lián)合的一般形式如下:

union 聯(lián)合標(biāo)簽(可選){
  類型1 標(biāo)識符1币旧;
  類型2 標(biāo)識符2;
  ...
  類型N 標(biāo)識符N;
}變量定義(可選);

聯(lián)合一般是作為大型結(jié)構(gòu)的一部分存在的猿妈。在有些大型結(jié)構(gòu)中吹菱,存在一些與實際表示的數(shù)據(jù)類型有關(guān)的隱式或顯式的信息。如果存儲數(shù)據(jù)時是一種類型彭则,但在提取該數(shù)據(jù)時卻成了另外一種類型鳍刷,這顯然存在著明顯的類型不安全性。在Ada語言中俯抖,所有不同類型的字段都顯式的存儲于記錄中倾剿,這就避免了這個問題。C語言則含糊的多蚌成,讓程序員自己去回憶放在那兒的究竟是什么東西前痘。

聯(lián)合一般用來節(jié)省空間,因為有些數(shù)據(jù)項是不可能同時出現(xiàn)的担忧,如果同時存儲它們芹缔,顯然頗為浪費(fèi)。例如瓶盛,如果我們要存儲一些關(guān)于動物種類的信息最欠,首先想到的方法可能是:

struct creature{
  char has_backbone;
  char has_fur;
  short num_of_legs_in_excess_of_4;
};

但是示罗,我們知道,所有的動物要么是脊椎動物芝硬,要么是無脊椎動物蚜点。進(jìn)而,我們還知道只有脊椎動物才可能有毛皮拌阴,只有無脊椎動物才可能有多于4條的腿绍绘。沒有一種動物既有毛皮又有超過4條的腿。這樣迟赃,可以通過把兩個互相排斥的字段存儲于一個聯(lián)合中來節(jié)省空間:

union secondary_characteristics{
  char has_fur;
  short num_of_legs_in_excess_of_4;
};
struct creature{
  char has_backbone;
  union secondary_characteristics form;
};

我們通常采取這種方式來節(jié)省備用的存儲空間陪拘。如果我們有一個數(shù)據(jù)文件,里面存儲了20000000個動物纤壁,使用這種方法左刽,可以節(jié)省大約20MB的磁盤空間。

然而酌媒,聯(lián)合還有其他用途欠痴,聯(lián)合也可以把同一個數(shù)據(jù)解釋成兩種不同的東西,而不是把兩個不同的數(shù)據(jù)解釋為一個東西秒咨。該用法例子如下:

union bits32_tag{
  int whole; //一個32位的值
  struct { char c0, c1, c2, c3;} bytes; //4個8位的字節(jié)
} value喇辽;

這個聯(lián)合允許程序員提取整個32位值(作為 int),也可以提取單獨的字節(jié)字段如value.bytes.c0等。采用其他的方法也能達(dá)到這個目的拭荤,但聯(lián)合不需要額外的賦值或強(qiáng)制類型轉(zhuǎn)換。

在實際工作中疫诽,結(jié)構(gòu)體的使用比聯(lián)合多得多舅世。

枚舉(enum)

枚舉(enum)通過一種簡單的途徑,把一串名字與一串整型值聯(lián)系在一起奇徒。對于像C這樣的弱類型語言而言雏亚,很少有什么事只能靠枚舉而不能用#define來解決的。枚舉的一般形式:

enum 可選標(biāo)簽 {內(nèi)容...} 可選變量定義摩钙;

其中的“內(nèi)容...”是把一些標(biāo)識符的列表罢低,可能有一些整型值賦給它們。下面是一個枚舉實例:

enum sizes { small = 7, medium, large = 10, humungous };

缺省情況下胖笛,整型值從0開始网持。如果對列表中的某個標(biāo)識符進(jìn)行了賦值,那么緊接其后的那個標(biāo)識符的值就比所賦的值大1长踊,然后類推功舀。枚舉具有一個優(yōu)點:#define 定義的名字一般在編譯時被丟棄,而枚舉名字則通常一直在調(diào)試器中可見身弊,可以在調(diào)試代碼時使用它們辟汰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末列敲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帖汞,更是在濱河造成了極大的恐慌戴而,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翩蘸,死亡現(xiàn)場離奇詭異所意,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鹿鳖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門扁眯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翅帜,你說我怎么就攤上這事姻檀。” “怎么了涝滴?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵绣版,是天一觀的道長。 經(jīng)常有香客問我歼疮,道長杂抽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任韩脏,我火速辦了婚禮缩麸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赡矢。我一直安慰自己杭朱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布吹散。 她就那樣靜靜地躺著弧械,像睡著了一般。 火紅的嫁衣襯著肌膚如雪空民。 梳的紋絲不亂的頭發(fā)上刃唐,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音界轩,去河邊找鬼画饥。 笑死,一個胖子當(dāng)著我的面吹牛浊猾,可吹牛的內(nèi)容都是我干的荒澡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼与殃,長吁一口氣:“原來是場噩夢啊……” “哼单山!你這毒婦竟也來了碍现?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤米奸,失蹤者是張志新(化名)和其女友劉穎昼接,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悴晰,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡慢睡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铡溪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漂辐。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棕硫,靈堂內(nèi)的尸體忽然破棺而出髓涯,到底是詐尸還是另有隱情,我是刑警寧澤哈扮,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布纬纪,位于F島的核電站,受9級特大地震影響滑肉,放射性物質(zhì)發(fā)生泄漏包各。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一靶庙、第九天 我趴在偏房一處隱蔽的房頂上張望问畅。 院中可真熱鬧,春花似錦六荒、人聲如沸护姆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽签则。三九已至须床,卻和暖如春铐料,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豺旬。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工钠惩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人族阅。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓篓跛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坦刀。 傳聞我的和親對象是個殘疾皇子愧沟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,940評論 2 89
  • 注:這是第三遍讀《C語言深度解剖》蔬咬,想想好像自從大學(xué)開始就沒讀完過幾本書,其中譚浩強(qiáng)的那本《C語言程序設(shè)計(第四版...
    HavenXie閱讀 1,730評論 1 6
  • 親愛的兒子: 這個寒假轉(zhuǎn)眼就結(jié)束了沐寺,明早你又要背起你那沉重的連媽媽都提不動的書包去上學(xué)了林艘。新的起點又開...
    Rain媽媽閱讀 687評論 0 0
  • 很多時候我們在執(zhí)行setState之后再執(zhí)行某些方法,如果單純把該方法放到setState函數(shù)之后混坞,你可能會很驚奇...
    meluyue閱讀 357評論 0 2
  • 既然選擇了遠(yuǎn)方狐援,便只顧風(fēng)雨兼程! 關(guān)于es6我也只是跟開始接觸究孕,說的不好請大家多多關(guān)照啥酱,希望能對學(xué)習(xí)前端的朋友一點...
    chasing_dream閱讀 292評論 0 2