C 速查手冊

6.3 結構

C 語言中的結構 (structure) 為異質的資料結構 (data structure) ,這意思是說結構中可以存放不同資料型態的資料體,每個資料體被稱為結構的成員,定義格式如下

struct name {
    datatype var1;
    ...
}

宣告定義關鍵字 (keyword) struct ,接著是結構名稱,然後用大括弧圍起來的成員宣告,須留意結構定義完的右大括弧其後接分號。

跟結構有關的運算子 (operator) 如下表

結構成員運算子.
結構指標運算子->

宣告為某結構的變數就可以用結構成員運算子存取該成員,而結構指標運算子可以讓指向某結構的指標變數存取其成員,如下例

#include <stdio.h>

struct point {
    int x;
    int y;
};

int main(void)
{
    struct point a;
    struct point *aPtr = &a;
    
    a.x = 3;
    a.y = 4;
    
    printf("a = (%d, %d)\n", a.x, a.y);  
    printf("*aPtr = (%d, %d)\n", aPtr->x, aPtr->y);

    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:structopt.c
    功能:示範結構定義、宣告及結構運算子的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc structopt.c
$ a.out
a = (3, 4)
*aPtr = (3, 4)
$

宣告、建立結構變數的地方

struct point a;

宣告變數 apoint 結構的變數,下一行

struct point *aPtr = &a;

宣告並設定 aPtr 為指向變數 a 的指標 (pointer) ,接著下兩行

a.x = 3;
a.y = 4;

便是利用結構成員運算子指派初值給變數 a ,最後印出結構成員的兩行

printf("a = (%d, %d)\n", a.x, a.y);  
printf("*aPtr = (%d, %d)\n", aPtr->x, aPtr->y);

分別用結構成員運算子及結構指標運算子取出 a 的值並印在螢幕上。

設定結構成員初值的部分可以用以下程式碼

struct point a = {3, 4};

來替代,利用大括弧指派初值,大括弧內依序是各個結構成員。

利用關鍵字 typedef 可以替結構建立新型態名稱

#include <stdio.h>

struct point {
    int x;
    int y;
};

typedef struct point Point;

int main(void)
{
    Point a = {3, 4};
    
    printf("a = (%d, %d)\n", a.x, a.y);  

    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:structtypedef.c
    功能:示範利用 typedef 建立新型態名稱
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc structtypedef.c
$ a.out
a = (3, 4)
$

typedef 出現的那一行

typedef struct point Point;

這替結構 point 建立 Point 型態名稱,因此往後可以直接使用 Point ,無須 struct point 兩字連用。

typedef 也可以直接寫進結構定義中,因此上例的結構定義可用以下寫法代替

typedef struct point {
    int x;
    int y;
} Point;

結構中的成員也可以是結構,例如

#include <stdio.h>

typedef struct point {
    int x;
    int y;
} Point;

typedef struct line {
    Point start;
    Point end;
} Line;

int main(void)
{
    Line a = {3, 4, 5, 6};
    
    printf("start = (%d, %d)\n", a.start.x, a.start.y);  
    printf("end = (%d, %d)\n", a.end.x, a.end.y);

    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:structstruct.c
    功能:示範在結構中使用其他結構當作成員
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc structstruct.c
$ a.out
start = (3, 4)
end = (5, 6)
$
結構還有另一個主題,自我參考的結構

上一頁 6.2 陣列
回 C 速查手冊首頁
下一頁 6.3.1 自我參考的結構
回 C 教材首頁
回程式語言教材首頁