1.什麼是結構體
結構體是一種專門設計用來存儲不同數據類型元素集合
結構體與數組的對比:
數組:只能由多個相同類型的數據構成。
結構體:可以由多個不同類型的數據構成。
2.結構體的定義
結構體內部的元素,也就是組成成分,我們一般稱爲”成員”。
結構體的一般定義形式爲:
struct 結構體名{
類型名1 成員名1;
類型名2 成員名2;
……
類型名n 成員名n;
};
- 1
- 2
- 3
- 4
- 5
- 6
struct是關鍵字,是結構體類型的標誌。
3.結構體初始化與使用
初始化:
struct Car {
int wheels; // 輪子數
int speed; // 速度
}car;
car = {4,250};
//使用:
printf("%d",car.wheels);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
4.結構體注意點
結構體類型的作用域
1> 定義在函數外面:全局有效(從定義類型的那行開始,一直到文件結尾)
2> 定義在函數(代碼塊)內部:局部有效(從定義類型的那行開始,一直到代碼塊結束)
不允許對結構體進行自身遞歸定義。
結構體內可以包含別的結構體。
只有在定義結構體變量時纔會進行內存空間分配。
5.結構體數組
跟結構體變量一樣,結構體數組也有3種定義方式
struct Student {
char *name;
int age;
};
struct Student stu[5];
struct Student {
char *name;
int age;
} stu[5];
struct {
char *name;
int age;
} stu[5];
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
上面3種方式,都是定義了一個變量名爲stu的結構體數組,數組元素個數是5。
初始化:
struct {
char *name;
int age;
} stu[2] = { {"MJ", 27}, {"JJ", 30} };
- 1
- 2
- 3
- 4
也可以用數組下標訪問每一個結構體元素。
6.結構體與函數
如果結構體作爲函數參數,只是將實參結構體所有成員的值對應地賦值給了形參結構體的所有成員
修改函數內部結構體的成員不會影響外面的實參結構體
7.枚舉
用來爲某變量定義固定值。
格式:
一般形式爲:enum 枚舉名 {枚舉元素1,枚舉元素2,……};
enum Season {spring, summer, autumn, winter};
// 定義枚舉變量
enum Season s;
//基本操作
s = spring; // 等價於 s = 0;
s = 3; // 等價於 s = winter;
9.枚舉的使用注意:
(1) C語言編譯器會將枚舉元素(spring、summer等)作爲整型常量處理,稱爲枚舉常量。
(2) 枚舉元素的值取決於定義時各枚舉元素排列的先後順序。默認情況下,第一個枚舉元素的值爲0,第二個爲1,依次順序enum Season {spring, summer, autumn, winter};
說spring的值爲0,summer的值爲1,autumn的值爲2,winter的值爲3
(3)也可以在定義枚舉類型時改變枚舉元素的值
enum season {spring, summer=3, autumn, winter};
- 1
沒有指定值的枚舉元素,其值爲前一元素加1。也就說spring的值爲0,summer的值爲3,autumn的值爲4,winter的值爲5
10.預處理
代碼編譯前對特殊的指令做解釋。
以#開頭,結尾不用分號。
1.宏定義
代碼編譯前對特殊的指令做解釋。
以#開頭,結尾不用分號。
不帶參數的宏定義
define 宏名 字符串
比如#define ABC 10
帶參數的宏定義
#define 宏名(參數列表) 字符串
- 1
與函數的對比:
(1) 宏定義不涉及存儲空間的分配、參數類型匹配、參數傳遞、返回值問題。
(2) 函數調用在程序運行時執行,而宏替換隻在編譯預處理階段進行。所以帶參數的宏比函數具有更高的執行效率。