->是 **結構體/聯合體指針訪問成員運算符**。
若p是指向結構體的指針,則p->member等價於(*p).member。
| 場景 | 變量類型 | 訪問語法 | 等價寫法 |
|---|---|---|---|
| 直接訪問 | struct Node n; | n.member | — |
| 指針訪問 | struct Node *p = &n; | p->member | (*p).member |
| 動態分配 | struct Node *p = malloc(sizeof(*p)); | p->member | (*p).member |
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Friend {
char name[20];
int age;
};
int main() {
struct Friend f1 = {"ZhangHe", 36};
struct Friend *p = &f1;
// 三種訪問方式完全等價
printf("直接訪問: %s, %d\n", f1.name, f1.age);
printf("指針 -> : %s, %d\n", p->name, p->age);
printf("解引用 . : %s, %d\n", (*p).name, (*p).age);
// 動態分配場景
struct Friend *q = malloc(sizeof(*q));
strcpy(q->name, "LiSi"); // 必須用 -> 或 (*q).
q->age = 25;
printf("動態分配: %s, %d\n", q->name, q->age);
free(q);
return 0;
}
->。p- 觸發補全,自動補齐 > 並列出成員。| 錯誤代碼 | 原因 | 修正 |
|---|---|---|
p.member | p 是指針,. 只能用於結構體變量 | 改為 p->member |
*p.member | . 優先級高於 *,解析為 *(p.member) (p 無成員) | 加括號 (*p).member 或用 p->member |
p->name = "New"; | 數組成員不可直接賦值字符串字面量 | 用 strcpy(p->name, "New") |
-> 是 C 語言為**結構體指針訪問成員**提供的語法糖,本質等價於 (*p).member 但更簡潔、優先級無歧義、可讀性更強。凡是持有結構體地址的指針 (&var、malloc、函數參數 struct Node*),訪問成員**統一使用 ->**,是專業 C 程序員的基本功。