定義
1)結構體是一種構造數據類型
2)把不同類型的數據組合成一個整體來自定義數據類型
8.2創建結構體類型
struct 結構體類型名 {
類型 成員1名;
類型 成員2名;
...
類型 成員3名;
};
解釋:
類型 : 任何學過的類型
成員x名: 標識符
注意:1.成員名和最后都有 ; 號
2.創建結構體類型本身并沒有分配任何存儲空間,用它定義變量的時候才分配空間
8.3創建結構體變量
8.3.1 利用已經創建的類型創建:struct 結構體類型名 結構體變量名;
例子:
8.3.2創建類型同時創建變量
struct 結構體類型名 {
類型 成員1名;
類型 成員2名;
...
類型 成員3名;
} 結構體變量名;
例子:
8.4結構體類型和變量定義形式
8.4.1一般形式
8.4.2匿名結構體
注意:這種形式一般用在結構體和聯合體中會比較方便。
8.4.3 define
8.4.4 typedef(起別名)
(常用)
作用:
(1)可以避免一些人理解的錯誤
例:char *a,b;
(2)用在結構體上帶來方便
(3)在一些很復雜的類型可以使用typedef起別名來帶來方便
(4)用typedef來定義與平臺無關的類型
typedef int BOOL
8.5計算結構體變量的成員
結構體變量名.成員名
(*結構體變量指針).成員名
結構體變量指針->成員名(重點)
實例:
8.6計算結構體和其變量字節數
sizeof(結構體類型名)
sizeof(結構體變量)
8.7結構體變量賦值
注意: 變量類型必須相同
補充:給數組賦值用strcpy
8.8結構體變量初始化
8.8.1 普通變量
例: struct student student = {"zhangsan", 1, 15, 59.9};
8.8.2 結構體數組
(1) 按結構初始化
例:struct student stu[3]={{"zhangsan", 1, 15},{"lishi", 0, 16}};
(2) 按順序初始化
例:struct student stu[] = {"zhangsan", 1, 15, "lishi", 0, 16};
實例:
8.9變量對齊
8.9.1 變量對齊
變量地址 % min(變量字節數, 機器位數/8) = 0
8.9.2 結構體成員變量對齊
結構體成員變量地址 % min(變量字節數, 機器位數/8) = 0;
8.9.3 結構體變量對齊
結構體成員變量的最大對齊方式相同
8.9.4 結構體成員變量偏移對齊
結構體成員變量偏移 % min(變量字節數, 機器位數/8) = 0;
補充:使用偽指令#pragma pack(n):C編譯器將按照n個字節對齊;
使用偽指令#pragma pack(): 取消自定義字節對齊方式。
例子:#pragma pack(2) //指定按2字節對齊
struct C
{
char b;
int a;
short c;
};
#pragma pack() //取消指定對齊,恢復缺省對齊
另外,還有如下的一種方式(GCC特有語法):
__attribute((aligned (n))): 讓所作用的結構成員對齊在n字節自然邊界上。如果結構體中有成員的長度大于n,則按照最大成員的長度來對齊。
__attribute__ ((packed)): 取消結構在編譯過程中的優化對齊,按照實際占用字節數進行對齊。
8.10 共用體(聯合體)
union 共用體類型名 {
類型 成員名1;
類型 成員名2;
};
注意:共用體使用方法同結構體完全相同,唯一區別在于:
1. 共用體各個成員共用內存
2. 共用體變量的大小取決于其最大元素的大小
補充:計算機的大小端序:字節序就是變量在內存中存放的方式。
大端序:字數據的高字節存儲在低地址中。
數據0x12345678
-------------------------------------------
| 地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
-------------------------------------------
| 內容 | 0x12 | 0x34 | 0x56 | 0x78 |
-------------------------------------------
小端序:字數據的低字節存儲在低地址中。
數據0x12345678
-------------------------------------------
| 地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
-------------------------------------------
| 內容 | 0x78 | 0x56 | 0x34 | 0x12 |
-------------------------------------------
8.11 枚舉類型
作用;給一組相關的字面常量取名, 并將它們定義為相同類型
用法:enum 枚舉類型名 {
常量名1,
常量名2,
...
};
注意:1. 沒有指定值時, 常量名1 值取 0, 后面每個常量的值等于前面常量的值加1
2. 可以給常量指定值,讓它們從某一整數開始