| 運算子 | 名稱 | 功能 |
| & | 取址 | 取得變數地址 |
| * | 解參考 | 取得指標指向的值 |
指標運算規則
- 賦值:同型別指標互賦、陣列名/字串常值/函數名賦予對應指標
- 加減:
p + n 移動 n * sizeof(*p) 位元組。僅陣列/字串指標有意義
- 關係:同陣列指標可比大小、等同、與 0 比較(空指標)
陣列指標 vs 指標陣列
int (*p)[4]; // 陣列指標:指向含 4 個 int 的陣列(二維陣列行)
int *p[4]; // 指標陣列:含 4 個 int* 的陣列
括號改變優先順序,含義天差地別。
字串指標 vs 字元陣列
| char *ps | char str[] |
| 本質 | 指標變數,儲存首址 | 陣列,儲存全字串 |
| 初始化 | char *ps = "text"; 可在區塊內 | 需 static 或逐字元賦值 |
| 修改內容 | 不可修改字面常數區 | 可修改 |
| 大小 | sizeof(ps)=指標大小 | sizeof(str)=陣列長度 |
函數指標
int (*pf)(int, int); // 指向回傳 int、參數兩 int 的函數
int max(int a, int b) { return a>b?a:b; }
pf = max;
int r = pf(3, 5); // 透過指標呼叫,r=5
- 不可算術運算
- 呼叫寫法:
(*pf)(args) 或 pf(args)
指標函數(回傳指標的函數)
int *create_array(int n) {
return malloc(n * sizeof(int));
}
指標陣列作參數 / main 參數
int main(int argc, char *argv[]) { ... }
// argv 為指標陣列,argv[0] 程式名,argv[1]... 參數
多級指標
int a = 10;
int *p = &a;
int **pp = &p; // 二級指標
**pp = 20; // 修改 a
組合宣告讀法:「由內而外,右優先」
int *(*a[10])(); // a 是陣列[10] → 元素是指標 → 指向函數 → 回傳 int*
// 讀法:a → [10] → * → () → * → int
標準讀法 7 步驟:int *(*(*a)())[10] → a 是函數指標 → 回傳指向 10 元素指標陣列的指標 → 元素指向 int。
小結:指標優勢
- 提升執行效率
- 實現函數間雙向資料傳遞
- 動態記憶體管理
- 表達複雜資料結構(鏈表、樹、圖)
- 上一篇文章: C 語言核心基礎速查:資料表示、類型、指標與記憶體模型
- 下一篇文章: C 語言函數大全:分類、參數傳遞、遞歸、變數作用域與儲存類別
Copyright ©
程式碼之家 All Rights Reserved