複合資料型別
阿新 • • 發佈:2019-02-04
結構體
作用:
封裝資料(把多種不同的資料型別放在一起)
注意:
一般放在全域性;分號不能省略。
結構體變數用點訪問
結構體指標用->訪問
初始化:
靜態初始化
動態初始化
使用注意事項:
給結構體中的陣列成員賦值時,不能直接將字串賦給陣列名,可以使用strcpy函式
給結構體中的指標變數成員賦值時,要先給指標分配空間,否則它會使一個野指標
靜態初始化即在定義的時候直接賦值
結構體陣列的初始化:使用for迴圈來完成
結構體中的對齊方式:
字對齊和半字對齊
字對齊:給每個變數先分配四個位元組的空間,如果下一個資料的資料型別與之相同,就可以放在一起,如果空間不夠就再開闢四個位元組的空間;如果型別不相同,就直接開闢四個位元組的空間
半字對齊:原理和字對齊大致相同,但是分配的空間為2個位元組
特別的:
char
short :8位元組
char
char
char :4位元組
short
記憶體空洞:由於字對齊和半字對齊造成的記憶體浪費
解決方法:在定義結構體的時候,儘量將相同型別的資料放在一起
共用體
和結構體的區別:
1.共用體的大小是其中最長的資料型別的長度,共用體中所有的成員共用同一段記憶體空間,但是其也滿足字對齊和半字對齊
2.共用體共用同一段空間,造成資料覆蓋
執行結果:p.num = 97(後面賦值的ch覆蓋了num,即輸出了’a’的ASCII碼值)#include union stu { int num; char ch; }; union stu p; p.num = 1; p.ch = 'a'; printf("p.num = %d\n",p.num);
運用:
一般使用共用體來驗證CPU的大小端(大端位元組序和小段位元組序是CPU的屬性,與作業系統無關):
小端位元組:低位元組存放在低地址,高位元組存放在高地址
大端位元組:高位元組存放在低地址,低位元組存放在高地址
無論大端位元組還是小端位元組,都是從低位元組開始存放的
具體程式:union node { int num; char ch; } int main() { union node p; p.num = 0x12345678; if(ch == 78) { printf("Small!\n"); } else { printf("Big!\n"); } return 0; }
列舉
只能代替整數巨集
作用:避免幻數,提高程式碼可讀性