結構體是一些值得集合,這些值稱為成員變數,結構體的每個成員可以使不同型別的變數,也可以是其他自定義型別,但是如果是自引用,那麼只能用指標。
typedef
struct node//重新命名(型別名)
node;
node p1;
//定義結構體變數
node p2 =
;//定義變數的同時賦初值
如何計算結構體的大小:
1.第乙個成員在結構體變數偏移量為0的位址處。
2.其他成員變數要對齊到對齊數的整數倍的位址處,對齊數是編譯器預設的乙個對齊數與該成員大小的較小值,vs中預設為8,linux中預設為4。
3.結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。
4.如果巢狀了結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。
為什麼存在記憶體對齊:
1.平台原因:不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2. 效能原因: 資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問
總體來說結構體的記憶體對齊是拿空間換時間的做法。所以在設計結構體時應該讓占用空間小的 成員盡量集中在一起
修改預設對齊數
#pragma pack(8)
//設定預設對齊數為8
#pragma pack()
//取消設定的預設對齊數,還原為預設
列舉常量
列舉就是把可能的取值一一枚舉,例如星期、性別、顏色等
enum color//顏色
;enum color c = blue;
//只能拿列舉常量給列舉變數賦值
以上定義的enum color是列舉型別,{}中的內容叫做列舉常量,列舉常量預設從0開始,一次遞增1,當然也可以在定義的時候賦初值。
列舉的優點
1.增加**的可讀性和可維護性
2.列舉有型別檢查,更加嚴謹
3.防止了命名汙染(封裝)
4.便於除錯
5.使用方便,一次可以定義多個常量
聯合型別定義的變數包含一系列的成員,特徵是這些成員共用同一塊空間(所以聯合也叫共用體)
union un
;union un a;
//聯合變數的定義
printf
("%d\n"
,sizeof
(a))
;//計算聯合變數的大小
聯合的特點
聯合的成員是共用同一塊記憶體空間的,這樣乙個聯合變數的大小,至少是最大成員的大小(因為聯合至少得有能力儲存最大的那個成員)。
聯合大小的計算
自定義型別 結構體 列舉 聯合
結構體 所謂結構體,就是將一大堆值放在一起,建立乙個新的型別,這些成員可以是不同型別的變數。struct tag variable list tag 要求 1.見名知意 2.可以省略 3.不建議省略 member list c語言中,不能為空 variable list 變數列表,可以省略,建議省略...
自定義型別 結構體,列舉,聯合
首先先說一下c語言的資料型別,其框架型別如圖所示 今天主要說一下結構體,列舉,聯合這三種自定義型別。1,結構體 1.1 結構體的宣告 結構體是一些值的集合,這些值稱為成員變數,結構體的每個成員可以是不同型別得變數。1 結構體的成員 結構體的成員可以是標量,陣列,指標,甚至是其他結構體。2 結構體的宣...
自定義型別 結構體,列舉,聯合
結構體的宣告 struct tag variable list 例如描述乙個學生 struct stu 分號不能丟特殊的宣告 在宣告結構的時候,可以不完全的宣告。比如 匿名結構體型別 struct x struct a 20 p 警告 編譯器會把上面的兩個宣告當成完全不同的兩個型別。所以是非法的。結...