指標同樣可以指向結構體,定義形式為:
struct 結構體名 *指標變數名;
struct stu {
char *name;
int num;
int age;
char group;
float score;
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
// 定義結構體指標並指向 stu1
struct stu *pstu = &stu1;
// 或在定義結構體時同時定義指標
struct stu { ... } stu1 = { ... }, *pstu = &stu1;
關鍵點:結構體變數名不會像陣列名那樣自動轉換為指標,必須使用 & 取得地址。結構體類型本身不佔記憶體,不可取址。
(*pointer).memberName —— . 優先級高於 *,括號不可省略。pointer->memberName —— -> 為箭頭運算子,專門用於結構體指標存取成員,更直觀、常用。兩者等效,推薦使用 ->。
#include <stdio.h>
int main() {
struct {
char *name; int num; int age; char group; float score;
} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
printf("%s的學號是%d,年齡是%d,在%c組,成績是%.1f!\n",
(*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
printf("%s的學號是%d,年齡是%d,在%c組,成績是%.1f!\n",
pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
return 0;
}
#include <stdio.h>
struct stu {
char *name; int num; int age; char group; float score;
} stus[] = {
{"Zhou ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"Liu fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
}, *ps;
int main() {
int len = sizeof(stus) / sizeof(struct stu);
printf("Name\t\tNum\tAge\tGroup\tScore\n");
for (ps = stus; ps < stus + len; ps++) {
printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
}
return 0;
}
結構體變數作參數會傳遞整個副本,成員多時開銷大。使用指標僅傳遞地址,效率高:
#include <stdio.h>
struct stu { ... } stus[] = { ... };
void average(struct stu *ps, int len);
int main() {
int len = sizeof(stus) / sizeof(struct stu);
average(stus, len);
return 0;
}
void average(struct stu *ps, int len) {
int i, num_140 = 0;
float sum = 0;
for (i = 0; i < len; i++) {
sum += (ps + i)->score;
if ((ps + i)->score < 140) num_140++;
}
printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
}
此技巧在大型結構體、頻繁呼叫函數的場景至關重要。