程式碼情境
typedef struct Stu {
char name[20];
int age;
} Stu;
Stu student[5] = { ... };
void sortedByName(Stu *p, int count) {
// 比較姓名
if (strcmp((p + j)->name, (p + j + 1)->name) > 0) { ... }
// 交換結構體
Stu temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
}
核心概念
p 是 Stu*,指向陣列首元素。
p + j 也是 Stu*,指向第 j 個元素。
(p + j)->name 等同 (*(p + j)).name,已取得 char*(字串指標),**不需再加 *****。
- 交換時
*(p + j) 解參考取得 Stu 實體,才能進行整結構體賦值。
口訣
- **存取成員** → 用
->(指標)或 .(實體),**不用 ***。
- **整體賦值/複製** → 需解參考
*ptr 取得實體。
- **指標運算** →
p + j 仍是指標,*(p + j) 才是實體。
範例對照
Stu stu1 = {"Alice", 20};
Stu *p = &stu1;
p->name; // 正確:指標存取成員
(*p).name; // 正確:解參考後存取
*p = stu1; // 正確:整體賦值
// *p->name; // 錯誤:優先級等同 *(p->name),name 是 char[] 無法解參考