結構的 宣告與使用

◎ 使用時機:用來將一群型態不同,卻又互相關聯的資料組合在一起,形成一種新的資料型態。例如想將學生的姓名、性別、國文成績、數學成績加以組合成一個新的資料型態,就可以使用「結構」。

◎ 結構定義語法:

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』。其中最後一種寫法特別常見,這在以後資料結構課程中的「鏈結串列」單元中經常可見,請多熟悉這樣的寫法。