int a = 10; int *p = &a; → p 存儲變量 a 的地址(如 0x7ffd1234),*p 訪問該地址處的 4 字節內容(值 10)。p + 1 移動 sizeof(int) 字節,而非 1 字節——這是類型系統賦予的語義。int **pp = &p; 畫二級指針指向一級指針指向變量。strcpy/strlen/strcmpint **arr = malloc(rows * sizeof(int*));)qsort 比較器、事件循環)list_head 源碼分析char *s = "hello"; s[0] = 'H'; 會崩潰」、「const int *p vs int *const p vs const int *const p 區別」。| 誤區 | 正確理解 |
|---|---|
| 指針就是整數 | 指針有類型,決定了解引用行為、算術步長、別名規則 |
| 數組名就是指針 | 數組名在大多數表達式中退化為指向首元素的指針,但 sizeof(arr)、&arr、字符串字面量初始化時保留數組類型 |
| malloc 分配的內存不用 free | 每個 malloc/calloc/realloc 必須配對 free,否則洩漏;長期運行程序必須嚴格管理 |
| 指針賦值後原內存自動複製 | p = q; 僅複製地址,雙方指向同一塊內存,修改 *p 影響 *q |
| 函數參數用指針就能修改實參指針本身 | 需傳遞指針的指針 (int **pp) 或 引用 (C++ int *&p) 才能修改實參指針指向 |
指針不難,難在不畫圖、不上機、不總結。遵循「畫圖 → 敲碼 → 看彙編 → 找坑 → 教他人」閉環,兩週內必能從「腦殼大」變為「指針自由」。記住:不會指針的 C 程序員,如不會換擋的司機——車開得動,但上不了高速(系統級開發)。