共用體?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...