假設 struct stu student[4] 為結構體陣列,struct stu *p = student; 指向陣列首元素。
| 方法 | 語法 | 說明 |
|---|---|---|
| 陣列下標法 | student[i].member | 最直觀,直接用索引 |
| 指標算術法 | (p+i)->member | p+i 指向第 i 元素,-> 解參考存取成員 |
| 指標陣列表示法 | p[i].member | p[i] 等價 *(p+i),再用 . 存取 |
struct data { int day, month, year; };
struct stu {
char name[20];
long num;
struct data birthday;
};
main() {
int i;
struct stu *p, student[4] = {
{"liying", 1, {1978,5,23}},
{"wangping", 2, {1979,3,14}},
{"libo", 3, {1980,5,6}},
{"xuyan", 4, {1980,4,21}}
};
p = student; // 指向陣列首地址
printf("1----Output name, number, year, month, day\n");
for (i = 0; i < 4; i++)
printf("%20s %10ld %10d //%d//%d\n",
(p+i)->name, (p+i)->num,
(p+i)->birthday.year, (p+i)->birthday.month,
(p+i)->birthday.day);
}
程式以指標算術法 (p+i)->member 遍歷輸出四筆學生資料,包含姓名、學號、生日(年/月/日)。巢狀結構體 birthday 成員同樣透過 -> 逐層存取。
p 即可,配合長度參數,靈活高效。p++ 可依序走訪陣列,無需索引變數。malloc),可建立大小可變的結構體動態陣列。p+i 需加括號 (p+i)->member,否則優先級錯誤。p[i].member 中 p[i] 已解參考,故用 . 而非 ->。struct stu *),否則指標算術位移錯誤。