結構的 宣告與使用
◎ 使用時機:用來將一群型態不同,卻又互相關聯的資料組合在一起,形成一種新的資料型態。例如想將學生的姓名、性別、國文成績、數學成績加以組合成一個新的資料型態,就可以使用「結構」。
◎ 結構定義語法:
struct 結構名稱 /* 定義結構 */
{
資料型態 成員名稱1;
資料型態 成員名稱2;
student |
chi |
name[20] |
sex |
math |
資料型態 成員名稱n;
};
(例) struct student
{
char name[20];
bool sex;
int chi, math;
};
※ 經過上述定義後,結構 student 的成員就包括了學生姓名 name[20](字元陣列)、性別 sex(布林型態)、國文成績chi(整數型態)、數學成績math(整數型態)等,如上圖所示。
◎ 宣告結構變數:在定義結構之後,就可以使用這種自訂的資料型態來宣告變數。
struct 結構名稱 變數1, 變數2, ......, 變數n; /* 宣告結構變數 */
(例) struct student a, b, class[50]; // 其中class[50]表示為一個結構陣列
※ 事實上可以將結構定義與變數宣告合併在一起,如下例。
(例) struct student
{
char name[20];
bool sex;
int chi, math;
} a, b, class[50];
◎ 結構變數使用:可使用「結構成員存取運算子」( .
)來存取變數內的成員,其格式如下:
結構變數名稱. 成員名稱
(例)a.name、 b.sex、 class[0].chi
※ 若要從鍵盤輸入成員資料,可用一般的scanf()、gets()等方式,見下例。
(例) scanf("%d", &a.chi);
gets(b.name);
// 前面不必加上&,因為name是字元陣列
※ 若要以一般敘述設定其值,見下例。
(例) strcpy (a.name, "Helen");
// 這是正確設定字串的方法,絕不可用『a.name = "Helen";』
b.sex = true;
class[5].chi = 95;
◎ 結構變數初值設定:在宣告變數時,可同時以『=』設定結構變數之各個成員初值,見下例。
(例) struct student a = {"Mary", false, 90, 65}, b = {"Jack", true,
70, 87};
◎ 指向結構的指標:如果有指標指向結構,那麼關於所指向的結構體,其成員間的存取關係就要注意正確的語法使用,見下例。
(例) 假定宣告了『struct student a, *p;』並且執行了『p = &a;』敘述,其關係圖如下:
p |
chi |
name[20] |
sex |
math |
a |
假定要存取其中的成員 chi ,則我們可以用『a.chi』,也可以用『(*p).chi』,也可以用『p->chi』。其中最後一種寫法特別常見,這在以後資料結構課程中的「鏈結串列」單元中經常可見,請多熟悉這樣的寫法。