C 語言初學教材 - 第四章 結構中可以有結構

就像二維陣列一樣,陣列中可以有陣列,結構的成員也可以是結構,這是說,當有需要的時候,結構的定義可以包含另一個結構的定義,前提是另一個必須已經先有定義。



例如平面幾何中,兩點可以決定一條線,我們可以定義結構 line ,包含兩個結構 point 成員,然後另一個浮點數成員 len 記錄這條直線的長度
struct line {
    struct point start;
    struct point end;
    float len;
};


當然,這樣結構 point 必須先定義,也就是說下列程式碼要放在結構 line 的定義之前
struct point {
    int x;
    int y;
    float h;
    char *p;
};


我們以下面做個簡單說明
#include <stdio.h>

struct point {
    int x;
    int y;
    float h;
    char *p;
};

struct line {
    struct point start;
    struct point end;
    float len;
};

typedef struct point Point;
typedef struct line Line;

int main(void)
{
    Point t1 = {3, 4, 5.0, "(3, 4)"};
    Point t2 = {5, 12, 13.0, "(5, 12)"}; 
    Line ab = {t1, t2, 8.54};
    
    printf("\n點 t1 的 x 座標為 %d\n", t1.x);
    printf("點 t1 的 y 座標為 %d\n", t1.y);
    printf("點 t1 到原點的距離為 %f\n", t1.h);
    printf("點 t1 以字串表示為 %s\n", t1.p);
    
    printf("\n點 t2 的 x 座標為 %d\n", t2.x);
    printf("點 t2 的 y 座標為 %d\n", t2.y);
    printf("點 t2 到原點的距離為 %f\n", t2.h);
    printf("點 t2 以字串表示為 %s\n", t2.p);
    
    printf("\n直線 ab 的起始座標為 %s\n", ab.start.p);
    printf("直線 ab 的結束座標為 %s\n", ab.end.p);
    printf("直線 ab 的長度為 %f\n", ab.len);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:structline.c
    功能:示範結構的使用
    作者:張凱慶
    時間:西元2010年7月 */


第 16 行及第 17 行
typedef struct point Point;
typedef struct line Line;


我們利用 typedef 將結構 point 定義為 Point 型態,另將結構 line 定義為 Line 型態,所以底下需要宣告結構 point 或結構 line 的時候,用 Point 型態或 Line 型態來宣告即可。


此外,我們看到第 35 行及第 36 行
printf("\n直線 ab 的起始座標為 %d\n", ab.start.p);
printf("直線 ab 的結束座標為 %d\n", ab.end.p);


若是要存取結構中的結構的成員,可以利用結構成員運算子 . 依序存取即可。


編譯執行,結果如下



問題與討論
  1. 如何存取結構中的結構成員?
  2. 如何用指向結構的指標存取結構成員?




沒有留言: