C语言中的枚举和联合体
一、枚舉類型 ?enum:
在實(shí)際應(yīng)用中,有的變量只有幾種可能取值。如人的性別只有兩種可能取值,星期只有七種可能取值。在 C 語(yǔ)言中對(duì)這樣取值比較特殊的變量可以定義為枚舉類型。所謂枚舉是指將變量的值一一列舉出來,變量只限于列舉出來的值的范圍內(nèi)取值。 枚舉的定義枚舉類型定義的一般形式為: enum 枚舉名 ?{ 枚舉值表 };
eg:enum weekday{sun,mon,tue,wed,thu,fri,sat};
注意:1.enum 變量類型還可以給其中的常量符號(hào)賦值,如果不賦值則會(huì)從被賦初值的那個(gè)常量開始依次加 1,如果都沒有賦值,它們的值從 0 開始依次遞增 1。eg:?
| 其中各常量名代表的數(shù)值分別為: | [cpp]?view plain?copy |
? ?
???2.枚舉元素不是變量,而是常數(shù),因此枚舉元素又稱為枚舉常量。因?yàn)槭浅A?#xff0c;所以不能對(duì)枚舉元素進(jìn)行賦值。?
3.枚舉值可以用來作判斷。例如:?
if (day==mon) {…}?
if (day>mon) {…}?
枚舉值的比較規(guī)則是:按其在說明時(shí)的順序號(hào)比較,如果說明時(shí)沒有人為指定,則第一個(gè)枚舉元素的值認(rèn)作 0。例如,mon>sun,sat>fri。?
C 語(yǔ)言教程 ?216??
4.一個(gè)整數(shù)不能直接賦給一個(gè)枚舉變量,必須強(qiáng)制進(jìn)行類型轉(zhuǎn)換才能賦值。例如:?
day=(enum weekday)2;?
這個(gè)賦值的意思是,將順序號(hào)為 2 的枚舉元素賦給 day,相當(dāng)于workday=tue;
二、枚舉與#define 宏的區(qū)別
下面再看看枚舉與#define 宏的區(qū)別:
1), #define 宏常量是在預(yù)編譯階段進(jìn)行簡(jiǎn)單替換。枚舉常量則是在編譯的時(shí)候確定其值。
2),一般在編譯器里,可以調(diào)試枚舉常量,但是不能調(diào)試宏常量。
3),枚舉可以一次定義大量相關(guān)的常量,而#define 宏一次只能定義一個(gè)。
下面再看看枚舉與#define 宏的區(qū)別:1), #define 宏常量是在預(yù)編譯階段進(jìn)行簡(jiǎn)單替換。枚舉常量則是在編譯的時(shí)候確定其值。
2),一般在編譯器里,可以調(diào)試枚舉常量,但是不能調(diào)試宏常量。
3),枚舉可以一次定義大量相關(guān)的常量,而#define 宏一次只能定義一個(gè)。
三、union共用體
1.? ?union 關(guān)鍵字的用法與 struct 的用法非常類似。
? ?union 維護(hù)足夠的空間來置放多個(gè)數(shù)據(jù)成員中的“一種”,而不是為每一個(gè)數(shù)據(jù)成員配置空間,在 union 中所有的數(shù)據(jù)成員共用一個(gè)空間,同一時(shí)間只能儲(chǔ)存其中一個(gè)數(shù)據(jù)成員,所有的數(shù)據(jù)成員具有相同的起始地址。例子如下:
union StateMachine
{
char character;
int number;
char *str;
double exp;
};
一個(gè) union 只配置一個(gè)足夠大的空間以來容納最大長(zhǎng)度的數(shù)據(jù)成員,以上例而言,最大長(zhǎng)度是 double 型態(tài),所以 StateMachine 的空間大小就是 double 數(shù)據(jù)類型的大小。
2.和struct的同與不同
union,中文名“聯(lián)合體、共用體”,在某種程度上類似結(jié)構(gòu)體struct的一種數(shù)據(jù)結(jié)構(gòu),共用體(union)和結(jié)構(gòu)體(struct)同樣可以包含很多種數(shù)據(jù)類型和變量。不過區(qū)別也挺明顯:
結(jié)構(gòu)體(struct)中所有變量是“共存”的——優(yōu)點(diǎn)是“有容乃大”,全面;缺點(diǎn)是struct內(nèi)存空間的分配是粗放的,不管用不用,全分配。
而聯(lián)合體(union)中是各變量是“互斥”的——缺點(diǎn)就是不夠“包容”;但優(yōu)點(diǎn)是內(nèi)存使用更為精細(xì)靈活,也節(jié)省了內(nèi)存空間。
? ?3.一個(gè)栗子[cpp]?view plain?copy4.大小端模式對(duì) union 類型數(shù)據(jù)的影響
下面再看一個(gè)例子:
union
{
int i;
char a[2];
}*p, u;
p = &u;
p->a[0] = 0x39;
p->a[1] = 0x38;
p.i 的值應(yīng)該為多少呢?
這里需要考慮存儲(chǔ)模式:大端模式和小端模式。
大端模式( Big_endian):字?jǐn)?shù)據(jù)的高字節(jié)存儲(chǔ)在低地址中,而字?jǐn)?shù)據(jù)的低字節(jié)則存放
在高地址中。
小端模式( Little_endian):字?jǐn)?shù)據(jù)的高字節(jié)存儲(chǔ)在高地址中,而字?jǐn)?shù)據(jù)的低字節(jié)則存放
在低地址中。
union 型數(shù)據(jù)所占的空間等于其最大的成員所占的空間。對(duì) union 型的成員的存取都是
相對(duì)于該聯(lián)合體基地址的偏移量為 0 處開始,也就是聯(lián)合體的訪問不論對(duì)哪個(gè)變量的存取都
是從 union 的首地址位置開始。
5.聯(lián)合體union適用場(chǎng)合:
union的使用場(chǎng)合,是各數(shù)據(jù)類型各變量占用空間差不多并且對(duì)各變量同時(shí)使用要求不高的場(chǎng)合(單從內(nèi)存使用上,我覺得沒錯(cuò))。
總結(jié)
以上是生活随笔為你收集整理的C语言中的枚举和联合体的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。