指針可指向任意類型,指向結構體類型變量/數組時,通過 -> 運算符訪問成員,代碼簡潔高效。本文覆蓋指向單個結構體變量、結構體數組的指針定義、內存分配、成員訪問三種形式。
struct stu {
char name[20];
long number;
float score[4];
};
struct stu *p1, *p2; // 定義指針
// 必須分配內存才能使用
struct stu *student = malloc(sizeof(struct stu));
關鍵: 指針定義後未指向有效內存,**必須用 malloc 分配**,否則解引用導致未定義行為。sizeof 返回類型字節數。
指針->成員
scanf("%s", student->name);
scanf("%ld", &student->number);
scanf("%d%d%d", &student->birthday.year, &student->birthday.month, &student->birthday.day);
printf("%20s%10ld%10d/%d/%d", student->name, student->number,
student->birthday.year, student->birthday.month, student->birthday.day);
嵌套結構體 birthday 成員鏈式訪問:student->birthday.year。
struct stu student[4], *p;
p = student; // p 指向數組首元素 student[0]
student 為數組名即首地址,p 指向首元素。
| 形式 | 語法 | 說明 |
|---|---|---|
| 1. 地址法 | (student+i)->member / (p+i)->member | student+i / p+i 為第 i 元素地址,等價 &student[i] |
| 2. 下標法 | student[i].member / p[i].member | p[i] 等價 *(p+i),語法直觀 |
| 3. 指針遞增法 | p->member; p++; | 遍歷數組時高效,但需保存首地址以便重置 |
(p+i)->name
(p+i)->num
(p+i)->birthday.year
(p+i)->birthday.month
(p+i)->birthday.day
掌握 malloc 為結構體指針分配內存、-> 運算符鏈式訪問嵌套成員、三種數組元素訪問形式的等價性與適用場景,能讓你靈活高效地操作結構體數據,是系統級、嵌入式、數據結構編程的基石技能。