自定義型別 結構體,列舉,聯合的知識小結

2021-08-19 19:05:19 字數 2197 閱讀 6146

我們通常所見資料大多成組出現,即它們的資料型別相同,但是如果資料型別不同怎麼辦?例如,描述乙個學生的資訊,包含姓名,年齡,性別等,它們資料型別不同,無法儲存於同乙個陣列中,在c語言中,我們可以通過使用結構把不同型別的值儲存在一起。

結構體宣告舉例**如下:

struct stu

;//注意:分號不能丟

結構體成員訪問:

(1)結構成員的直接訪問:結構變數的成員是通過點操作符(.)訪問的。左運算元就是結構變數的名字,右運算元就是需要訪問的成員的名字

(2)結構體成員的間接訪問:如果你擁有乙個指向結構體的指標,我們首先應該做的是對指標執行間接訪問操作,獲得這個結構,然後使用點操作符來訪問呢它的成員

struct stu

s;void print(struct stu* s)

注意:結構體的間接訪問形式有兩種,建議選擇第二種。即(->)方式。

這個知識點非常重要!!!

記憶體對齊我們要了解兩個問題:

(1)為什麼存在記憶體對齊?

答:2.效能原因:資料結構(尤其是棧)應該盡可能的在自然邊界對齊,原因在於,為了訪問未對齊的記憶體,處理器需要兩次記憶體訪問,而對齊的記憶體只需要一次訪問即可。

總的來說:這是一種拿空間換取時間的做法。

(2)記憶體對齊的規則是什麼?

答:1. 結構體的第乙個成員永遠對齊到結構體起始位置的0偏移處;

2.從第二個成員開始,每個成員都對齊到【對其數】的整數倍處;

【對齊數】:為成員自身大小和【預設對齊數】的較小值;

【預設對齊數】:linux--4位元組  windows--8位元組;

3.結構體的總大小時所有對齊數中最大對齊數的整數倍;

4.如果結構體巢狀了結構體,那麼巢狀的結構體對齊到自己的最大對齊數的整數倍處,

結構體的整體大小就是所有最大對齊數(包含巢狀結構體的對齊數)的整數倍。

因為如果你想要傳乙個結構體物件的時候,假如結構體過大,那麼在引數壓棧時,系統開銷過大,造成效能下降,

所以選擇傳結構體的位址。

請注意:位段的概念十分重要,因為它可以極大的減少記憶體的浪費,具體優點向後看----》

什麼是位段?

位段的宣告和結構體十分相似,主要有兩大區別:

一是:位段的成員必須是int ,unsigned int ,signed inrt

二是:位段的成員名後面有乙個冒號和乙個數字

位段舉例:

struct a//定義乙個位段

;int main()

注意:1位元組=8bit

關於位段你需要注意的事情:

1.位段是不跨平台的,因此,注重可移植的程式應該避免使用位段

2.int 位段被當成是有符號數還是無符號數不確定的,

3.位段中的成員在記憶體中是從左到右發分配還是從右到左分配是不確定的。

4.當乙個結構體包含兩個以上位段時,從第二個開始,無法容納於第乙個位段剩餘的位時,是捨棄還是利用?未知!!!

當然,對於一般而言,位段的記憶體分配就像是你想的那樣,具體可以寫**測出來。

總的來說,位段只要不考慮跨平台問題,可以達到很好的節省空間。

列舉舉例:

enum ***//定義乙個性別列舉

;//---->分號不可少

注意:{}內部的內容是列舉型別的可能取值,也稱為列舉常量,預設從0開始,一次遞增1;

列舉的優點:(*****):

1.增加**的可讀性和可維護性

2.防止了命名汙染(封裝),即:防止命名衝突

3.便於除錯;

4.使用更方便,一次可以定義多個變數;

5.列舉有型別檢查,和#define定義的識別符號相比,更加嚴謹;

聯合的特點:這些型別定義的變數包含一系列的成員,特點是這些成員共用同一塊記憶體空間

聯合舉例:

union un//聯合型別的宣告

;union un un;//聯合變數的定義

int main()

聯合大小的計算:

1.聯合的大小至少為最大成員的大小

2.當聯合的大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。

舉例說明:

union un1

;int main()

自定義型別 結構體 列舉 聯合

結構體 所謂結構體,就是將一大堆值放在一起,建立乙個新的型別,這些成員可以是不同型別的變數。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 警告 編譯器會把上面的兩個宣告當成完全不同的兩個型別。所以是非法的。結...