指標可指向結構體起始位址,宣告語法:struct student *p;。透過指標存取成員有兩種寫法:
(*p).score:先解參考再存取p->score:箭頭運算子,更常用、可讀性更高#include <stdio.h>
struct student {
int num;
char name[20];
char sex;
int age;
float score;
};
struct student stu[3] = {
{11302, "Wang", 'F', 20, 486.69},
{11303, "Zhao", 'F', 25, 466.59},
{11304, "Xue", 'M', 26, 483.59}
};
int main() {
struct student student1 = {11305, "Li", 'F', 19, 59.59};
struct student *p, *q;
int i;
p = &student1; // 指向單一結構體
printf("%s,%c,%f\n", student1.name, (*p).sex, p->score);
q = stu; // 指向陣列首元素
for (i = 0; i < 3; i++, q++) {
printf("%s,%c,%f\n", q->name, (*q).sex, stu[i].score);
}
return 0;
}
| 運算式 | 含義 |
|---|---|
p->num++ | 先取值再遞增(後綴++) |
++p->num | 先遞增再取值(前綴++) |
(p++)->num | 先用 p 存取,再 p 遞增指向下一個 |
(++p)->num | 先 p 遞增指向下一個,再存取 |
void print(struct student s) { // 複製整個結構體
printf("%s,%d,%f\n", s.name, s.age, s.score);
}
// 呼叫:print(stu[i]);
void add(struct student *q) { // 傳遞位址,可修改原資料
if (q->age <= 19) q->score += 10;
}
// 呼叫:add(p); 或 add(&stu[i]);
int main() {
struct student *p;
int i;
// 傳值:print 接收副本,不影響原資料
for (i = 0; i < 3; i++) print(stu[i]);
// 傳址:add 接收指標,可修改原資料
for (i = 0, p = stu; i < 3; i++, p++) add(p);
// 再次列印驗證修改結果
printf("\n");
for (i = 0, p = stu; i < 3; i++, p++) print(*p); // *p 相當於 stu[i]
return 0;
}
const 保護struct student,並 return *q;