結構體
位段
枚舉
聯合體
結構是一些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量。
例如描述一個學生
在聲明結構體的時候,可以不完全的聲明
段落引用但是如果寫出p=&x,并不合法,編譯器會把上面的兩個聲明當成完全不同的兩個類型 1.4結構體的自引用 在結構中包含一個類型為該結構本身的成員是否可以? 錯誤的引用方式
正确的引用方式
結構體自身引用需要在引用的時候加一個指針,但是引用其他結構體則不需要指針
注意:
//下面代碼是否可行
//解決方案
有了結構體類型,定義變量則很簡單
兩段代碼的結果分别是12和8
此時,我們會好奇,明明結構體的内容相同,為什麼他們所占記憶體空間卻不同,此時,就是我們的記憶體對齊
記憶體對齊規則
第一個成員在與結構體變量偏移量為0的位址處。 其他成員變量要對齊到某個數字(對齊數)的整數倍的位址處。 對齊數 = 編譯器預設的一個對齊數 與 該成員大小的較小值。 VS中預設的值為8 結構體總大小為最大對齊數(每個成員變量都有一個對齊數)的整數倍。 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整 體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。 總結來說 結構體的記憶體對齊是拿空間來換取時間的做法。 那在設計結構體的時候,我們既要滿足對齊,又要節省空間,如何做到: 讓占用空間小的成員盡量集中在一起。

結果為8
這裡明明隻需要2+5+10+30=47個bit,等同與6個位元組足夠了,為什麼會是8個位元組的結果呢,下面我們來探讨
位段的成員可以是 int ,unsigned int, signed int 或者是 char (屬于整形家族)類型
位段的空間上是按照需要以4個位元組( int )或者1個位元組( char )的方式來開辟的。
位段可以大大降低記憶體的浪費,比如當我們存儲一個人的性别時,我們可能有男,女,保密,未知這幾種情況,我們用兩個bit就可以表示出來,我們可以将它規定存儲位元組為2bit,我們正常的存儲方式是用一個int來接收,一個int有32個位元組,然而我們隻需要兩個位元組,這時位段的來幫助我們填補缺點; 下面的十進制轉二進制時,如果位數不夠,我們在前面補0
當然有利有弊,位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程式應該避免使用位段。
int 位段被當成有符号數還是無符号數是不确定的。
位段中最大位的數目不能确定。(16位機器最大16,32位機器最大32,寫成27,在16位機
器會出問題。
位段中的成員在記憶體中從左向右配置設定,還是從右向左配置設定标準尚未定義。
當一個結構包含兩個位段,第二個位段成員比較大,無法容納于第一個位段剩餘的位時,是
舍棄剩餘的位還是利用,這是不确定的。
跟結構相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台的問題存在。
枚舉就是舉例,把可能的取值列舉
比如我們的生活中,一周的星期一到星期日是有限的七天,可以列舉 性别有:男、女、保密,也可以列舉 月份有12個月
以上定義的enum Day,enum Sex,enum Color都是枚舉類型。{}中的内容是枚舉類型可能的取值,也叫枚舉常量 這些枚舉常量都是有值的,預設從0開始,依次遞增1,當然也可以在定義的時候指派 例如:
enum Color clr = GREEN;
clr = 5;
結果為4。
聯合的成員是共用同一塊記憶體空間的,這樣一個聯合變量的大小,至少是最大成員的大小(因為 聯合至少得有能力儲存最大的那個成員)。
面試題:
判斷目前計算機的大小端存儲
或者
聯合的大小至少是最大成員的大小。
當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
比如:
結果為8和16