掌握結構體 位段 列舉 聯合

2021-08-20 08:57:22 字數 1582 閱讀 4724

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 正確 指標是四個位元組 結構體內存對齊...