boy[1].score (*ps).score ps->score
ps 為 struct stu *,指向結構/數組元素首地址。注意:(*ps).score 括號不可省(. 優先級高於 *)。
struct stu boy[5], *ps; ps = boy; // 指向 boy[0] ps + 1; // 指向 boy[1](自動跨越 sizeof(struct stu) 字節) ps + i; // 指向 boy[i]
與普通數組指針一致,編譯器自動處理步長。
struct stu *ps;
for (ps = boy; ps < boy + 5; ps++)
printf("%d\t%s\t%c\t%f\n", ps->num, ps->name, ps->sex, ps->score);
禁忌:ps = &boy[1].sex; ❌ 不能指向單一成員,只能指向整個結構/元素。
ANSI C 允許結構值傳遞,但會逐成員拷貝(含數組),開銷大。最佳實踐:傳指針,僅傳遞地址(4/8 字節)。
void ave(struct stu *ps) {
int c = 0, i; float s = 0;
for (i = 0; i < 5; i++, ps++) {
s += ps->score;
if (ps->score < 60) c++;
}
printf("avg=%f, fail=%d\n", s/5, c);
}
main() { struct stu *ps = boy; ave(ps); }
全程指針算術(ps++、ps->member),無數組下標開銷,速度更快、代碼更緊湊。