C語言查缺補漏 九 共用體與列舉型別

2021-08-28 16:55:58 字數 1527 閱讀 7337

​ 共用體?what?它是什麼,上了兩年大學的我有點懵逼。共用體已然成了我c語言的盲區。

​ 存在必然有它的意義,所以惡補了一下有關共用體的知識。

​ 那麼他們兩個的區別呢?從上上篇查缺補漏系列博文中 跳轉至查缺補漏(七),我們知道結構體不同型別型別成員按照記憶體對齊規則,「排隊」占用記憶體,而共用體,則是所有型別成員共用同一塊記憶體(也就是說他們的起始位置都是從0開始)。

​ 既然所占用記憶體都是從0開始,那麼共用體有兩個特徵:

union a ;

//省略**

a p1;

p1.a = 1; p1.b = 2;

printf("%d %d\n", p1.a, p1.b); //結果p1.a,p1.b輸出都為2

p1.a++;

printf("%d %d\n", p1.a, p2.b); //結果p1.a, p1.b都輸出為3

共用體所佔記憶體的總大小,必須是它內部最大成員所佔記憶體大小的整數倍(像陣列,結構體等成員在計算時按其成員的最大成員所佔記憶體算),不是要補齊

union a ;				//共用體a總共所佔記憶體位址為0~11

union b ; //共用體b總共所佔記憶體位址為0~15

在共用體a中:

​ int型別a為4位元組,所以占用0~3位置

​ int型別a為4位元組,所以占用0~3位置

​ char型陣列s中最大成員單個char為1位元組,而陣列長度為10,所以占用0~9位置

​ 在共用體a中,最大成員為int型的4位元組,所用占用記憶體大小為4的倍數,由於最大占用空間為10,所以共用體至少占用記憶體位置為0~11

在共用體b中:

​ double型別t為8位元組,所以占用0~7位置

​ a型別a中最大成員為int型別為4位元組,a型別總的記憶體占用為12位元組,所以占用0~11位置

​ int型陣列b中最大成員單個int為4位元組,而陣列長度為3,所以占用0~11位置

​ 在共用體b中,最大成員為double型的8位元組,所用占用記憶體大小為8的倍數,由於最大占用空間為12,所以共用體至少占用記憶體位置為0~15

​ 列舉型別大學期間使用次數僅僅比共用體好上那麼一丟丟,舉個列舉型別的栗子:

enum week ;
關於列舉型別只要記住兩點就可以:

——列舉型別只能由整數成員組成,每個成員對應乙個整數編號(預設從0開始)

​ 例如上邊**,預設sunday的值為0,monday的值為1,一直到saturday的值為6

——列舉型別的值可相同,未顯性賦值的成員將從它前乙個顯性編號的成員以此+1

​ 例如以下**中:

enum week ;
​ 上邊**中,sunday為1,monday為2,tuesday為3,wednesday為0,thursday為1,friday為2, saturday為3

​ 好啦,共用體和列舉型別查缺補漏完畢!

​ 如果有寫的不對或者不全面的地方 可通過主頁的****進行指正,謝謝!

C 查缺補漏之陣列與指標

陣列的維數必須使用大於等於一的常量表示式來定義,此常量表示式只能包含整型字面值常量,列舉型別,或者用常量表示式初始化的整型,非const變數和到執行階段才知道其值的const變數都不能用來定義陣列的維數 ok 字面值常量 int array 10 ok 列舉型別 enum arraysize int...

C語言查缺補漏 八 typedef的使用

至於typedef,說起來實在是太丟人了!這兩年一直以為這個關鍵字是結構體的專屬關鍵字 typedef 結構體型別 型別別名 型別別名 變數名 定義 最近才發現,它不僅可以給結構體起別名,還可以給各種各樣的型別起各種各樣的別名,用法實在是太活了!比如基本資料型別 typedef int size s...

C語言查缺補漏 十四 gdb的使用

在linux系統下如果想要除錯乙個專案,我們應該怎麼做?有些童鞋可能會說 ide呀!沒毛病老哥 非常標準的答案。除此之外,我們還可以使用gdb,為什麼使用gdb,它有什麼優勢呢?它可以在終端下使用,它短小精悍,功能強大 嗯嗯嗯,我就是這樣說服自己的 要注意!使用gdb前,我們在編譯專案檔案時需加 g...