結構: struct
結構是由程序猿自己設計的一種數據類型,用于描述一個事務的各項數據,由若干個不同的基礎數據類型組成。設計結構:struct 結構體名{類型 成員名;...};定義結構體變量struct 結構體名 變量名;注意:定義結構變量時,struct不能省略定義并初始化結構變量 struct 結構體名 變量名 = {v1,v2,v3,...}; 根據成員的順序進行初始化
也可以 struct 結構體名 變量名 = {.成員名= ,.成員名= ,.成員名= ,...} 只初始化某些成員
同類型的結構變量可以直接賦值訪問成員:變量名.成員名;結構指針->成員名; 結構體變量作為形參時:由于結構變量的字節數都比較大,值傳遞效率比較低,因此都傳遞結構體變量的地址如果不需要修改結構變量的值,可以用const保護 typedef 重定義結構類型:typedef struct 結構名 結構名;之后就可以不用加struct關鍵字typedef struct 結構體名{...}結構體名;注意:結構體變量一般存儲在堆內存計算結構體的字節數結構體成員的順序會影響它的總字節數大小,在設計結構體時,如果順序合理能夠大大節約內存。內存對齊:假設第一個成員從零地址開始,存儲每個成員的地址編號必須能被比它的字節數整除,如果不能會填充空字節內存補齊:結構體的總字節數,必須是它最大成員字節數的整數倍,如果不是則在末尾填充空字節注意:在Linux系統下計算結構體的對齊、補齊時,如果成員的字節數超過4,則按照4字節計算在windows系統,則按照實際情況計算#pragma pack(n) 設置對齊、補齊的最大字節數 n<=默認Linux:1、2、4...
聯合: union
聯合與結構的使用方法基本一致,與結構的區別是所有成員共用的一塊內存,如果一個成員的值發生改變,其他成員的值也會隨之發生改變
聯合就是用少量的內存對應多個標識符,從而達到節約內存的目的,現在基本上不再使用。
常考的筆試題:
union Date
{char ch[10];int num;
}
12
注意:聯合天然對齊,但計算聯合的字節數時要考慮內存補齊如何判斷系統是大端系統還是小端系統?假如十六進制整數0x01020304存儲在以0x0A為起始的4字節內存中:小端:高位數據存儲在高位地址中(0A:04 0B:03 0C:02 0D:01)大端:高位數據存儲在低位地址中(0A:01 0B:02 0C:03 0D:04)個人計算機系統一般都是小端系統,UNIX服務器和網絡設備都是大端,網絡字節序也是大端模式的數據序列化和反序列化
枚舉: enum
枚舉就是一種數據類型,把所有可能出現的值列出來,可以取一個有意義的名字,除此之外,該類型的變量在等于其他值都是非法的(愿望)enum 枚舉名{枚舉常量1,枚舉常量2,...};枚舉就可以看作是一種類型受限的int類型,但是編譯器為了效率并不會檢查數據的值,所以在C語言中枚舉可以當作int類型使用enum Dirextion{UP=183,DOWN,LEFT,RIGHT};
如果不給成員值,枚舉常量的值默認從0開始,逐漸加1,如果某個設置了值,后面的在它的基礎上加1為什么要用枚舉:為無意義的數據取一個有意義的名字,提高代碼的可讀性和安全性(比宏常量安全)