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列舉它被用來存放固定的不可改變的型別,比如說,四...