結構體自定義型別的知識

2021-08-17 02:09:11 字數 1682 閱讀 9861

1、結構體是是一些值的集合,這些值被稱為成員變數。

2、結構體內的成員可以是不同型別的成員變數。

3、建立結構體

struct s

;

4、結構體內部成員的訪問:(1)結構體變數訪問成員(結構變數的成員是通過點操作符(.)訪問的.操作符接受兩個運算元。如果s是結構體的具體名稱,age 是其內部成員,則s.age就可以訪問)。

(2)結構體訪問指標變數的成員(定義乙個指向該結構體的結構型別的指標ps,如果age是該結構體的內部成員,則(*s).age或者ps->就可以訪問)。

5、結構體自引用:在結構體中可以包含該結構體本身的成員,具體的自引用如下:

struct node

;

struct point

a;//宣告型別的同時定義變數a

struct point b;

//定義結構體b

struct point c =

;//初始化:定義變數同時賦初值

struct node

n1 =(10

,,null);

//結構體巢狀初始化

struct node n2 =

,null};

//結構體巢狀初始化

記憶體對齊原則:

1.第乙個成員在結構體變數偏移量為0的位址。

2.其他成員變數對齊到對齊數的整數倍位址。vs預設8,linux預設4.

對齊數= 與成員大小相比,取較小值。

3.結構體總大小為最大對齊數的整數倍。

4.如巢狀其他結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(包括巢狀的結構體)的整數倍。

為什要記憶體對齊?

平台原因(移植原因): 不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址 處取某些特定型別的資料,否則丟擲硬體異常。

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

例子

struct s

總共9個位元組,因為最大對齊數為4,所以總大小要是4的倍數,所以最終大小為12

struct s1

最終大小 8

struct s3

最終大小 16

位段成員必須是int,unsigned int,signed int

struct s ; 

a佔3位,b佔4位,剛好佔乙個位元組,剩下一位丟棄。

c佔5位,d佔4位,兩個位元組。

總共佔3個位元組。

將內容一一枚舉:

enum ***//性別

;

聯合也是一種特殊的自定義型別 這種型別定義的變數也包含一系列的成員,特徵是這些成員公用同一塊空間(所以 聯合也叫共用體)可以用來判斷大小端,以及ip位址轉化。

union un

;int

main()

else

return0;

}

自定義型別 結構體

struct tag 結構體型別名稱 variable list 結構體變數 省略結構體型別名稱 匿名結構體型別 當省略掉結構體型別名稱時,就不能省略掉結構體變數,這樣是不合理的,所以一般我們不建議省略結構體型別名 struct x,y 全域性變數 struct a 20 p int main 注意...

自定義型別 結構體(1)

結構體與陣列的區別 陣列的元素可以通過下標訪問,這是因為,陣列的長度相同。但是,結構體每乙個成員的長度都可能不同,所以不能通過下標來訪問它們,但是,結構體的每個成員都有自己的名字,結構體是通過名字來訪問的。結構體宣告結構體是一些值的集合,這些值稱為它的成員,乙個結構體的各個成員具有不同的型別。str...

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

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