1.結構體的宣告
struct tag //tag是標籤
member -list; //成員列表
}variable //是變數列表
2.結構體可以不完全宣告--也就是可以去掉tag
通過型別建立記憶體空間,例項化
3.結構體成員的訪問
結構體成員可以用符號 . 來訪問,例如:variable.member
有時我們用結構體指標來訪問成員,例如:p->member,他就相當於 (*p).member
4.結構體自引用
自引用,在資料結構煉表裡最常見
struct node
int data;
struct node *next
}node;
5.最重要的是了解結構體內存對齊
結構體是如何記憶體對齊的?
舉個栗子:下面結構體的位元組大小是多少呢?
struct s1
它的總大小是8個位元組
struct s1
它的總大小是12個位元組
首先要掌握結構體對齊規則
1.第乙個成員在與結構體變數偏移量為0的位址處
2,其他成員要對齊到某個對齊數的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的比較值。(其中vs為8,
linux 為4)
3.結構體總大小為最大對齊數的整數倍
4.如果巢狀了結構體情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數的整數倍
如果你不明白的話,多找幾個題練習下,就會了
6.為什麼要存在記憶體對齊?
記憶體對齊需要浪費一部分空間,為什麼需要它呢?
1.平台原因:
不是所有平台都能訪問任何位址上的任意資料的,某些平台只能在某些位址處取某些特定的型別資料,否則丟擲硬體異常
2.效能原因:
資料結構應該盡可能的對齊,原因在於為了訪問未對齊的的記憶體,處理器需要作兩次訪問,而對齊的記憶體只需要訪問一次
1.什麼是位段?
1.位段和結構體成員類似
2,位段成員必須是int ,unsigned int, sign int,char
3.位段的成員名後面有乙個冒號和乙個數字
4.位段是不跨平台使用的
(1)int 位段被當成有符號數和無符號數是不確定的
(2)位段中的最大為的數目不能確定
(3)位段中的成員不知道向左還是向右分配記憶體
(4)捨棄問題,不知道是捨棄還是利用
enum 是全域性變數
列舉的優點:
1.增加**的可讀性,可維護性
2.防止命名汙染
3.利用除錯
4,有型別檢查,更加嚴謹
5一次可以定義多個變數
聯合是一種自定義型別,它定義的變數包含一系列的成員,它們公用同一塊空間(所以他也叫共用體)
聯合計算小的方式:
1.聯合的大小至少也是最大成員的大小,
2.當最大成員大小不是最大對齊數的整數倍的時候,就需要對齊到最大對齊數的整數倍
結構體,位段,列舉,聯合
結構體是一種可以將不同型別打包在一起的一種使用者自定義型別。描述乙個學生 struct student stu 這裡的定義及使用要遵循以下原則 第乙個 第二次定義變數時 時可採用以下形式進行二次定義 struct student a 第二個 也可用以下形式定義 typedef struct stud...
結構體 位段 列舉 聯合小結
1.結構體型別建立 struct tag variable list 變數列表 其中,struct是定義結構體的關鍵字,tag是結構體標籤 1 定義型別的同時,定義變數 struct student stu 該例即定義了結構體型別student,同時定義了student結構體型別的結構體變數stu。...
自定義型別 結構體 位段 列舉 聯合
include include include 1 結構體 結構是一些值的集合,這些值稱為結構體成員,結構體的每個成員可以是不同型別的變數 struct stu 結構體的自引用 struct node 錯誤的,結構體內不能包含結構體自身 struct node 正確 指標是四個位元組 結構體內存對齊...