c語言結構體的定義和使用
一、什麼是結構體
在實際問題中,一組資料往往具有不同的資料型別;例如在學生資訊登記表中,姓名為字元型,學號為整型或字元型,年齡為整型,性別為字元型,成績為整型或實型。因為資料型別不同,顯然不能用一個數組來存放。
在C語言中,可以使用結構體(Struct)來存放一組不同型別的資料。結構體(struct)指的是一種資料結構,是C語言中聚合資料型別(aggregate datatype)的一類。結構體可以被宣告為變數、指標或陣列等,用以實現較複雜的資料結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的型別,成員一般用名字訪問。
- 定義結構體的一般形式為:
struct 結構體名{
成員列表
};
在成員表列中可以是幾種基本資料型別,也可以是結構體型別。
struct 型別名{} 變數;後的分號不能漏
- 例如用結構體來表示學生資訊:
struct stu{
char *name; //姓名
int num; //學號
char sex; //性別
float score; //成績
};
二、結構體變數
結構體也是一種資料型別,可以用來說明變數。例如:
struct stu stu1, stu2;
定義了兩個變數 stu1 和 stu2,它們都是 stu 型別,都由 4 個成員組成。注意關鍵字struct不能少。
也可以在定義結構體的同時定義結構體變數:
struct stu{
char *name; //姓名
int num; //學號
char sex; //性別
float score; //成績
} stu1, stu2;
如果只需要 stu1、stu2 兩個變數,也可以不寫結構體名字:
struct{ //沒有寫 stu
char *name; //姓名
int num; //學號
char sex; //性別
float score; //成績
} stu1, stu2;
這樣做書寫簡單,但是因為沒有結構體名,後面就沒法用該結構體定義新的變數。
也可以用巨集定義使一個符號常量來表示一個結構型別,例如:
#define STU struct stu
STU{
char *name; //姓名
int num; //學號
char sex; //性別
float score; //成績
};
STU stu1, stu2;
後面我們會學習Windows程式設計,大部分結構體都是這樣定義的。
typedef和#define用法不同,甚至可以結合起來靈活使用,使用時一定要注意兩者的不同之處。
三、成員的獲取和賦值
在C語言中,使用點號.來獲取結構體中的一個成員,一般格式為:
結構變數名.成員名
例如:
stu1.name; //第一個學生的姓名
stu2.score; //第二個學生的成績
獲取成員後,就可以對該成員進行賦值了,例如:
stu1.name = “Tom”;
stu2.score = 90.5;
除了可以對成員進行逐一賦值,也可以像陣列一樣整體賦值,例如:
struct stu{
char *name; //姓名
int num; //學號
char sex; //性別
float score; //成績
} stu1, stu2 = { "Tom", 10, 'M', 90 };
不過整體賦值僅限於上面這樣的情況,也就是定義結構體的同時宣告變數。下面的寫法是錯誤的:
stu2 = { "Tom", 10, 'M', 90 };
一個完整的示例:
#include <stdio.h>
#define STU struct stu
int main(){
STU{
char *name; //姓名
int num; //學號
char sex; //性別
float score; //成績
};
STU stu1;
stu1.name = "James Bond";
stu1.num = 1;
stu1.sex = 'M'; //用M表示男性,W表示女性
stu1.score = 99;
printf("Hello everyone! My name is %s, a naughty boy, but with good scores(%.2f) and top No.(%d)!", stu1.name, stu1.score, stu1.num);
return 0;
}