c語言中聯(lián)合體和枚舉用法詳解
一、聯(lián)合體
(1) 像結(jié)構(gòu)體?樣,聯(lián)合體也是由一個(gè)或者多個(gè)成員構(gòu)成,這些成員可以不同的類型。
(2)但是編譯器只為最大的成員分配足夠的內(nèi)存空間。聯(lián)合體的特點(diǎn)是所有成員共用同一塊內(nèi)存空間。所以聯(lián)合體也叫:共用體。
(3) 給聯(lián)合體其中?個(gè)成員賦值,其他成員的值也跟著變化。
1. 聯(lián)合體類型的聲明和創(chuàng)建
關(guān)鍵字:union
聲明:
#include <stdio.h> //聯(lián)合類型的聲明 union Un// 類型名 { char c;//成員 int i; }; int main() { union Un s = {0};//創(chuàng)建 return 0; }
2. 聯(lián)合體的特點(diǎn)
聯(lián)合的成員是共用同?塊內(nèi)存空間的,這樣?個(gè)聯(lián)合變量的大小,至少是最大成員的大小(因?yàn)槁?lián)合至少得有能力保存最大的那個(gè)成員)。
//代碼1 #include <stdio.h> //聯(lián)合類型的聲明 union Un { char c; int i; }; int main() { //聯(lián)合變量的定義 union Un un = {0}; // 下?輸出的結(jié)果是?樣的嗎? printf("%p\n", &(un.i)); printf("%p\n", &(un.c)); printf("%p\n", &un); return 0; }
運(yùn)行結(jié)果:
它們的地址都是一樣的,說明它們共用一塊空間
我們再來舉一個(gè)例子
union Un { char c; int i; }; int main() { //聯(lián)合變量的定義 union Un un = { 0 }; un.i = 0x11223344; printf("%x\n", un.i); un.c = 0x55; printf("%x\n", un.i); return 0; }
運(yùn)行結(jié)果:
為什么結(jié)果不一樣呢?
是因?yàn)樗鼈児灿靡粔K空間,當(dāng) c 使用時(shí)就會改變 i 的值
內(nèi)存布局:
3. 聯(lián)合體大小的計(jì)算
聯(lián)合的大小至少是最大成員的大小。
當(dāng)最大成員大小不是最大對齊數(shù)的整數(shù)倍的時(shí)候,就要對齊到最大對齊數(shù)的整數(shù)倍。
如:
#include <stdio.h> union Un1 { char c[5]; int i; }; union Un2 { short c[7]; int i; }; int main() { //下?輸出的結(jié)果是什么? printf("%d\n", sizeof(union Un1)); printf("%d\n", sizeof(union Un2)); return 0; }
運(yùn)行結(jié)果:
當(dāng)遇到數(shù)組是我們只看類型如char c[5];->我們只看char的對齊數(shù),char的對齊數(shù)為1
第一個(gè)輸出結(jié)果
該類型的最大對齊數(shù)為4(int)
數(shù)組的大小為7,我們要保證它的大小,只能是最大對齊數(shù)的倍數(shù),所以是8
第二個(gè)輸出結(jié)果同理
4.總結(jié)
(1)使用聯(lián)合體是可以節(jié)省空間的
(2)使用聯(lián)合體的一個(gè)成員時(shí)就不要使用其他成員(因?yàn)槠渌蓡T的值會發(fā)生變化)
二、枚舉
1. 枚舉類型的聲明
關(guān)鍵字:enum
枚舉顧名思義就是??列舉。
把可能的取值??列舉。
比如我們現(xiàn)實(shí)生活中: ?周的星期?到星期日是有限的7天,可以??列舉
性別有:男、女、保密,也可以??列舉
月份有12個(gè)月,也可以??列舉
三原色,也是可以意義列舉 這些數(shù)據(jù)的表示就可以使用枚舉了。
如:
enum Day//星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; enum Sex//性別 { MALE, FEMALE, SECRET }; enum Color//顏? { RED, GREEN, BLUE };
以上定義的 enum Day , enum Sex , enum Color 都是枚舉類型。
{}中的內(nèi)容是枚舉類型的可能取值,也叫 枚舉常量 。
這些可能取值都是有值的,默認(rèn)從0開始,依次遞增1,當(dāng)然在聲明枚舉類型的時(shí)候也可以賦初值。
如:
enum Color//顏? { RED=2, GREEN=4, BLUE=8 };
2. 枚舉類型的優(yōu)點(diǎn)
為什么使用枚舉? 我們可以使用 #define 定義常量,為什么非要使用枚舉? 枚舉的優(yōu)點(diǎn):
增加代碼的可讀性和可維護(hù)性
和#define定義的標(biāo)識符?較枚舉有類型檢查,更加嚴(yán)謹(jǐn)。
便于調(diào)試,預(yù)處理階段會刪除 #define 定義的符號
使用方便,?次可以定義多個(gè)常量
枚舉常量是遵循作用域規(guī)則的,枚舉聲明在函數(shù)內(nèi),只能在函數(shù)內(nèi)使用
3. 枚舉類型的使用
enum Color//顏? { RED=1, GREEN=2, BLUE=4 }; enum Color clr = GREEN;//使?枚舉常量給枚舉變量賦值
那是否可以拿整數(shù)給枚舉變量賦值呢?在C語言中是可以的,但是在C++是不?的,C++的類型檢查比較嚴(yán)格。
總結(jié)
到此這篇關(guān)于c語言中聯(lián)合體和枚舉用法詳解的文章就介紹到這了,更多相關(guān)c語言聯(lián)合體和枚舉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言編程中的聯(lián)合體union入門學(xué)習(xí)教程
- C語言中聯(lián)合體union的實(shí)例詳解
- C語言中枚舉與聯(lián)合體的使用方法(enum union)
- C語言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解
- C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解
- C語言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用
- C語言枚舉與聯(lián)合體深入詳解
- C語言中聯(lián)合體與共用體和枚舉使用語法示例
- C語言聯(lián)合體類型的實(shí)現(xiàn)
- 一文帶你認(rèn)識C語言的聯(lián)合體和枚舉
- C語言聯(lián)合體的實(shí)現(xiàn)示例
相關(guān)文章
C語言常用庫函數(shù)的使用及模擬實(shí)現(xiàn)詳解例舉
C語言庫函數(shù)是把自定義函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來詳細(xì)了解它2022-04-04C語言實(shí)現(xiàn)BMP轉(zhuǎn)換JPG的方法
這篇文章主要介紹了C語言實(shí)現(xiàn)BMP轉(zhuǎn)換JPG的方法,涉及C#圖片格式轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07C語言數(shù)據(jù)結(jié)構(gòu)之二分法查找詳解
二分查找算法是在有序數(shù)組中用到的較為頻繁的一種算法,在未接觸二分查找算法時(shí),最通用的一種做法是,對數(shù)組進(jìn)行遍歷,跟每個(gè)元素進(jìn)行比較,其時(shí)間為O(n),但二分查找算法更優(yōu)2022-02-02C語言 棧的表示和實(shí)現(xiàn)詳細(xì)介紹
這篇文章主要介紹了C語言 棧的表示和實(shí)現(xiàn)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-12-12C++日期類(Date)實(shí)現(xiàn)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C++語言實(shí)現(xiàn)日期類(Date),可以實(shí)現(xiàn)確定某年某月有多少天、打印日期等功能,感興趣的可以了解一下2022-07-07C語言標(biāo)準(zhǔn)時(shí)間與秒單位相互轉(zhuǎn)換
這篇文章主要介紹了C語言標(biāo)準(zhǔn)時(shí)間與秒單位相互轉(zhuǎn)換,秒單位與標(biāo)準(zhǔn)時(shí)間的轉(zhuǎn)換方式,這份代碼一般用在嵌入式單片機(jī)里比較多,比如:設(shè)置RTC時(shí)鐘的時(shí)間,從RTC里讀取秒單位時(shí)間后,需要轉(zhuǎn)換成標(biāo)準(zhǔn)時(shí)間顯示。下文分享需要的小伙伴可以參考一下2022-05-05