前言
這篇博客就把剩下的兩個自定義類型聯(lián)合體和枚舉好好總結(jié)一下,讓我們好好看看聯(lián)合體和枚舉到底是什么
個人主頁:小張同學(xué)zkf
若有問題 評論區(qū)見
感興趣就關(guān)注一下吧
目錄
?1. 聯(lián)合體
1.1 聯(lián)合體類型的聲明
?1.2 聯(lián)合體的特點
?1.3 相同成員的結(jié)構(gòu)體和聯(lián)合體對比
?1.4 聯(lián)合體大小的計算
2. 枚舉類型
2.1 枚舉類型的聲明
2.2 枚舉類型的優(yōu)點
?2.3 枚舉類型的使用
?
?1. 聯(lián)合體
1.1 聯(lián)合體類型的聲明
# include <stdio.h>// 聯(lián)合類型的聲明union Un{char c;int i;};int main (){// 聯(lián)合變量的定義union Un un = { 0 };// 計算連個變量的??printf ( "%d\n" , sizeof (un));return 0 ;}
輸出結(jié)果:4
由圖可見他們倆共處一個空間,所以字節(jié)長度為最大的類型int
?1.2 聯(lián)合體的特點
# include <stdio.h>// 聯(lián)合類型的聲明union Un{char c;int i;};int main (){// 聯(lián)合變量的定義union Un un = { 0 };un.i = 0x11223344 ;un.c = 0x55 ;printf ( "%x\n" , un.i);return 0 ;}
輸出結(jié)果:11223355
由圖可知是將最低位由于聯(lián)合體的特點,覆蓋成c的55。
那我們想一下,既然c和i共處一室,它們的地址會一樣嗎?
我們試一下
# 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 ;}
輸出結(jié)果:
001 AF85C001 AF85C001 AF85C
可見輸出結(jié)果一樣,這也就說明聯(lián)合體地址和里面每個成員名的地址是一樣的
?1.3 相同成員的結(jié)構(gòu)體和聯(lián)合體對比
struct S? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{char c;int i;};struct S s = { 0 };??union Un{char c;int i;};union Un un = { 0 };
聯(lián)合體相較于結(jié)構(gòu)體可以節(jié)省空間,但是它會出現(xiàn)成員與成員覆蓋的情況?
?1.4 聯(lián)合體大小的計算
?我們了解了聯(lián)合體在內(nèi)存中的布局,那聯(lián)合體的字節(jié)大小到底怎么計算那
我們首先要知道:
# 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 ;}
我們先分析un1,根據(jù)前面博客分析的結(jié)構(gòu)體而言,char的最大對齊數(shù)是1,int的最大對齊數(shù)為4,所以這個聯(lián)合體的最大對齊數(shù)為4,聯(lián)合體至少也是最大成員的空間,成員中最大的空間是char c[5],為5,5不是4的倍數(shù),所以對齊到8的位置,就是8;再看un2,un2至少為14個字節(jié)吧,short和int的對齊數(shù)分別為2和4,所以最大對齊數(shù)為4,14不是4的倍數(shù),所以要對齊到16的位置,大小為16。
我們認識了聯(lián)合體,那我們是不是又有一種巧妙的方式判斷大小端了
int check_sys (){union{int i;char c;}un;un.i = 1 ;return un.c; // 返回 1 是?端,返回 0 是?端}
既然char成員占據(jù)低地址處的位置,那此時i為1,返回c,正好可以直接判斷這個位置上的數(shù)字。?
2. 枚舉類型
枚舉是 C 語言中的一種基本數(shù)據(jù)類型,用于定義一組具有離散值的常量
2.1 枚舉類型的聲明
一周的星期一到星期日是有限的7天,可以一 一列舉性別有:男、女、保密,也可以??列舉月份有12個月,也可以??列舉三原色,也是可以一 一列舉
?這些數(shù)據(jù)的表示就可以使用枚舉了。
enum Day // 星期{Mon,Tues,Wed,Thur,Fri,Sat,Sun};enum Sex // 性別{MALE,FEMALE,SECRET} ;enum Color // 顏?{RED,GREEN,BLUE};
這些可能取值都是有值的,默認從0開始,依次遞增1,當(dāng)然在聲明枚舉類型的時候也可以賦初值。
比如:
enum Color // 顏?{RED= 2 ,GREEN= 4 ,BLUE= 8};
若不賦初值
enum Color // 顏?{RED ,//0GREEN ,//1BLUE//2};
那里面的常量值就默認從0開始依次加一
若中間賦初值
enum Color // 顏?{RED ,//0GREEN ,//1BLUE=8,//8YELLOW//9};
可見剛開始不賦初值的時候,依然從零開始依次加一,從哪開始賦初值,就從這個初值的基礎(chǔ)上依次加一。
2.2 枚舉類型的優(yōu)點
這時肯定有人會想定義常量的話,那我們可以用#define宏定義呀,為什么會有枚舉這東西那
相比#define枚舉可以調(diào)試,而#define在調(diào)試時會直接在預(yù)處理階段替換。
我們來看一下枚舉的優(yōu)點就知道了
枚舉的優(yōu)點:1. 增加代碼的可讀性和可維護性2. 和#define定義的標(biāo)識符比較枚舉有類型檢查,更加嚴謹。3. 便于調(diào)試,預(yù)處理階段會刪除 #define 定義的符號4. 使用方便,一次可以定義多個常量5. 枚舉常量是遵循作用域規(guī)則的,枚舉聲明在函數(shù)內(nèi),只能在函數(shù)內(nèi)使用
?2.3 枚舉類型的使用
enum Color // 顏?? {?RED= 1 ,?GREEN= 2 ,?BLUE= 4? };? enum Color clr = GREEN;
結(jié)束語
枚舉和聯(lián)合體總結(jié)完了,這兩個和上一篇的結(jié)構(gòu)體都可以用typedef關(guān)鍵字重命名,好了全部自定義類型總結(jié)完了
OK,感謝觀看文章來源:http://www.zghlxwxcb.cn/news/detail-851332.html
?
文章來源地址http://www.zghlxwxcb.cn/news/detail-851332.html
到了這里,關(guān)于【C語言】聯(lián)合體和枚舉的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!