C語言除了可以使用基本資料型別以外,也可以自定義新的資料型別。新的資料型別由多個基本資料型別組成的,自定義資料型別分為 結構體 聯合體(共用體) 列舉
1.結構體
(1)基本語法
在實際問題中,比如表示一個學生,學生本身包含學號(整型),姓名(字串),身高(浮點型),分數(浮點型)…,這些屬性不應該分開,而是構成一個整體來代表一個完整的學生。
C語言中可以使用結構體來將多個不同的資料型別組合起來,形成某種意義上的自定義的資料型別。
使用結構體前必須先宣告(型別),宣告結構體使用struct關鍵字
宣告語法:
struct 結構體型別名{
結構體成員型別 成員變數名;
…
};
比如:
struct student{
int id;//學號成員
char name[20];//姓名成員
float height;//身高成員
//float weight;
//結構體宣告不分配記憶體空間,所以成員變數在宣告不能初始化
//struct 結構體型別名 代表新定義的結構體型別
宣告結構體變數(不能省略struct):
struct 結構體型別名 結構體變數名;
也可以在宣告結構體型別時同時宣告結構體變數,通常不這麼做
} 結構體變數名;
(2)結構體變數的初始化
結構體變數的初始化有兩種語法,第一種是使用陣列初始化的方法進行初始化。
struct student stu = {10,“xiaoming”,175.2f};
第二種結構體初始化方法對指定的成員分別進行初始化。這種初始化的語法不要求初始化順序,而且允許只初始化一部分成員,方便對結構體進行擴充套件
struct student stu = {
.id = 10,//前面是一個小圓點,表示結構體中的某個成員
.name = “hello”,
.height = 180.4f,
//未被初始化的成員將被初始化為0
(3)結構體成員的訪問
結構體相當於一個集合,內部有多個成員,每個成員都可以單獨訪問,訪問結構體成員需要使用一個新的運算子 --------- .(成員運算子)
語法如下:
結構體變數.成員變數名;
stu.id = 100;
//std.name = “zkk”;//錯誤
strcpy(std.name,“zkk”);
stu.height = 155.5f;
(4)結構體宣告語法的擴充套件
結構體宣告通常使用typedef對結構體型別起別名,語法如下:
typedef struct 結構體型別名{
} 結構體類型別名;
typedef struct student{
} Stu;
//Stu 等價於 struct student
使用typedef時可以省略結構體型別名,語法如下:
typedef struct{
宣告結構體時可以省略結構體型別名,這種結構體叫匿名結構體,匿名結構只能使用一次。
//匿名結構體
struct{
(5)結構體指標與陣列
結構體指標可以記錄結構體變數的地址,型別為 結構體型別 *
透過結構體指標也可以訪問結構體變數,透過箭頭運算子(->)
Stu *pstu = (Stu *)malloc(sizeof(Stu));
pstu->id = 100;
strcpy(pstu->name,“zzy”);
pstu->height = 161.5f;
使用結構體作為陣列元素型別構成結構體陣列,訪問語法和普通陣列沒有區別,將每個元素當成結構體使用。
struct student s[5];//擁有5個元素的學生結構體陣列
s[0].id = 10;
(&s[0])->id = 100;
(s+1)->id = 10;//第2各元素的id成員
(*(s+1)).id = 100;
(6)結構體作為函式形參和返回值
結構體變數可以直接作為形參使用
不應該直接使用結構體變數作為函式的形參而應該使用結構體指標
結構體變數可以直接作為返回值使用
不應該直接使用結構體變數作為函式的返回值而應該使用結構體指標
結構體可以巢狀,結構體的成員也可以是結構體。
C語言除了可以使用基本資料型別以外,也可以自定義新的資料型別。新的資料型別由多個基本資料型別組成的,自定義資料型別分為 結構體 聯合體(共用體) 列舉
1.結構體
(1)基本語法
在實際問題中,比如表示一個學生,學生本身包含學號(整型),姓名(字串),身高(浮點型),分數(浮點型)…,這些屬性不應該分開,而是構成一個整體來代表一個完整的學生。
C語言中可以使用結構體來將多個不同的資料型別組合起來,形成某種意義上的自定義的資料型別。
使用結構體前必須先宣告(型別),宣告結構體使用struct關鍵字
宣告語法:
struct 結構體型別名{
結構體成員型別 成員變數名;
…
};
比如:
struct student{
int id;//學號成員
char name[20];//姓名成員
float height;//身高成員
//float weight;
};
//結構體宣告不分配記憶體空間,所以成員變數在宣告不能初始化
//struct 結構體型別名 代表新定義的結構體型別
宣告結構體變數(不能省略struct):
struct 結構體型別名 結構體變數名;
也可以在宣告結構體型別時同時宣告結構體變數,通常不這麼做
struct 結構體型別名{
結構體成員型別 成員變數名;
…
} 結構體變數名;
(2)結構體變數的初始化
結構體變數的初始化有兩種語法,第一種是使用陣列初始化的方法進行初始化。
struct student stu = {10,“xiaoming”,175.2f};
第二種結構體初始化方法對指定的成員分別進行初始化。這種初始化的語法不要求初始化順序,而且允許只初始化一部分成員,方便對結構體進行擴充套件
struct student stu = {
.id = 10,//前面是一個小圓點,表示結構體中的某個成員
.name = “hello”,
.height = 180.4f,
};
//未被初始化的成員將被初始化為0
(3)結構體成員的訪問
結構體相當於一個集合,內部有多個成員,每個成員都可以單獨訪問,訪問結構體成員需要使用一個新的運算子 --------- .(成員運算子)
語法如下:
結構體變數.成員變數名;
比如:
stu.id = 100;
//std.name = “zkk”;//錯誤
strcpy(std.name,“zkk”);
stu.height = 155.5f;
(4)結構體宣告語法的擴充套件
結構體宣告通常使用typedef對結構體型別起別名,語法如下:
typedef struct 結構體型別名{
結構體成員型別 成員變數名;
…
} 結構體類型別名;
比如:
typedef struct student{
int id;//學號成員
char name[20];//姓名成員
float height;//身高成員
} Stu;
//Stu 等價於 struct student
使用typedef時可以省略結構體型別名,語法如下:
typedef struct{
結構體成員型別 成員變數名;
…
} 結構體類型別名;
比如:
typedef struct{
int id;//學號成員
char name[20];//姓名成員
float height;//身高成員
} Stu;
宣告結構體時可以省略結構體型別名,這種結構體叫匿名結構體,匿名結構只能使用一次。
//匿名結構體
struct{
結構體成員型別 成員變數名;
…
} 結構體變數名;
(5)結構體指標與陣列
結構體指標可以記錄結構體變數的地址,型別為 結構體型別 *
透過結構體指標也可以訪問結構體變數,透過箭頭運算子(->)
Stu *pstu = (Stu *)malloc(sizeof(Stu));
pstu->id = 100;
strcpy(pstu->name,“zzy”);
pstu->height = 161.5f;
使用結構體作為陣列元素型別構成結構體陣列,訪問語法和普通陣列沒有區別,將每個元素當成結構體使用。
struct student s[5];//擁有5個元素的學生結構體陣列
s[0].id = 10;
(&s[0])->id = 100;
(s+1)->id = 10;//第2各元素的id成員
(*(s+1)).id = 100;
(6)結構體作為函式形參和返回值
結構體變數可以直接作為形參使用
不應該直接使用結構體變數作為函式的形參而應該使用結構體指標
結構體變數可以直接作為返回值使用
不應該直接使用結構體變數作為函式的返回值而應該使用結構體指標
結構體可以巢狀,結構體的成員也可以是結構體。