C語言複雜資料型別

2021-07-06 09:40:44 字數 2894 閱讀 6196

1、結構體

一、結構體的三種定義方式

方式一:

//結構體標準寫法

struct person

;struct person personnomal=;

方式二:

struct person

myperson=;//定義結構體的同時,初始化乙個person 結構體

struct person personnomal=;//定義新的person 結構體

方式三:

struct

myperson=;//定義結構體的同時,初始化乙個person 結構體

struct

personnomal=;//定義新的person 結構體 這種方式每次都要重新寫一遍結構體,最是繁雜

2、結構體內存剖析

struct a

;printf("a的size大小是:%d\n",sizeof(a));

struct b

;printf("b的size大小是:%d\n",sizeof(b));

/*** a的size大小是:16

b的size大小是:24

* * */

結構體a的記憶體儲存狀態如圖所示,畫的不好見諒啊,本來已經寫好了一篇部落格,奈何不見了,不見了,對於有強迫症的我來說只好再來一篇。

下面看b的記憶體儲存狀態圖

為什麼會這樣呢?

首先 成員 a在記憶體中 佔4個位元組,b佔4個位元組,c佔8個位元組

結構體中成員的記憶體的分配需要考慮到位址對齊的因素,a結構體中,由於c需要占用8個位元組,所以分配的每個成員的最大長度是8

當a儲存時首先占用了4個位元組,b存也需要4個位元組,而a正好剩餘4個,所以a和b共同占用8個位元組,c單獨使用8個位元組。

同理 當儲存b結構體時,最大成員長度也是8,先分配出8個位元組長度,成員a放進去了,剩餘4個位元組長度,這個時候需要儲存c,c需要8個位元組長度,所以a剩餘的空間放不進去了,所以c單獨佔一行,儲存b時只能再開闢8個位元組長度。

其實很簡單,計算結構體所佔的記憶體長度只要簡單的構思一下就可以了。

這裡還有另外一種方法,首先理解幾個概念。

偏移量:結構體內部成員的位址相對於結構體起始位址的長度。

結構體的長度:等於結構體最後乙個成員的偏移量加上最後乙個成員的本身的大小。

但是需要滿足兩個條件:

1、成員的偏移量等於成員自身大小的整數倍。

2、結構體的長度是所有成員大小的整數倍。

按照上面的方法分析上面**中的兩個結構體:

a

成員a的偏移量是0(0是任何大小的整數倍),同時a滿足上面兩個條件,成員b的偏移量是4(成員a的偏移量加上a自身的大小),滿足條件(偏移量4是成員b的大小的整數倍),成員c的偏移量是8(成員b的偏移量加上成員b自身的大小),8是成員c的的整數倍,所以a的長度是成員c的偏移量加上成員c自身大小8等於16,16又是所有成員的整數倍,滿足條件。

b

成員a的偏移量是0,成員c的偏移量是4,4不是成員c自身大小8的整數倍,所以偏移量4補上4(補全演算法),成員b的偏移量是16(成員c的偏移量加上自身大小等於16),16是成員b自身大小的整數倍滿足條件,所以b結構體的大小是16+4等於20不滿足條件二,取成員a,b,c最小公倍數等於24.

特別的是:

struct c

;printf("c的size大小是:%d\n",sizeof(c));

//結果是96 a的大小4 ,b的大小 10,c的大小20乘以4等於80,

//需要的最小記憶體是94,但是94不是a的倍數,補全2,等於96

3、結構體陣列

//結構體陣列

struct person

;struct person p[3]=,,};

// p[0]=;這樣是不可以滴

p[0].age=10;

4、結構體指標

struct person

;//結構體指標

//跟平常定義指標的方式沒啥區別吧?

struct person * personpoint;

struct person person=;

personpoint=&person;

//指標修改結構體內成員變數

personpoint->age=28;

5、結構體巢狀

//結構體巢狀定義

struct birthday

;struct person;

struct person jim=};

printf("%d",sizeof(jim));

//結果:32 結構體birthday的大小24 加上 person前兩個成員的大小8

6、列舉

//列舉

enum season

;enum season sea=spring;

C複雜資料型別

結構體 1 表示更豐富的複雜型別 以後類這個概念的 2 內部屬性定義的順序 不影響使用,但是會影響記憶體分配 3 關鍵知識點在於記憶體大小的對齊問題。structstudent 聯合體 1 同乙個記憶體區域可以存放不同資料型別 非常少見 2 內部屬性的定義不影響使用也不影響記憶體分配 3 操作了乙個...

複雜資料型別

1 在c語言中,除了之前學到的基本資料型別 整型,浮點型,字元型 外,還有指標型別和構造型別 結構型,聯合型,列舉型 2 結構體型別,用於把不同型別的資料組合成乙個集合體,宣告格式 struct 結構名 例如 includestruct students void main 結構體的特點是 表示更豐...

複雜資料型別

1結構體 相當於是高階語言裡的類,但是他沒有方法,也就是行為,只有屬性,也就是成員,結構體相當於是自定義類 宣告struct students 當我們需要使用結要用結構體裡的類的屬性時,我們需要通過 運算子來進行呼叫,比如 students.age 2列舉它被用來存放固定的不可改變的型別,比如說,四...