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