指標是 C/C++ 最強大也最危險的特性。本系列首篇建立指標的精確心智模型:定義、四大核心屬性(指標型別、指向型別、指標值/指向記憶體區、指標自身記憶體),為後續運算、記憶體管理、進階應用奠定基礎。
指標:一類特殊變數,儲存「另一個變數或函式的記憶體位址」。
語法:宣告語句去掉指標名稱後剩下的部分。
int *ip; // 型別:int*
char *cp; // 型別:char*
int **pp; // 型別:int**
int (*ap)[5]; // 型別:int(*)[5] (指向 int[5] 的指標)
決定:指標自身佔用記憶體大小(32 位元 = 4 bytes)、參與指標運算的位移單位、型別檢查規則。
語法:宣告語句去掉指標名稱與最左邊的 * 後剩下的部分。
int *ip; // 指向:int
char *cp; // 指向:char
int **pp; // 指向:int*
int (*ap)[5]; // 指向:int[5]
決定:解參考 *ip 時,編譯器將目標記憶體視為何種型別;sizeof(*ip) 的值。
sizeof(指向型別) 的連續位元組。sizeof(指標型別) 可得知:32 位元 = 4 bytes,64 位元 = 8 bytes。&p 合法,&(p+1) 非法)。| 屬性 | 來源 | 決定事項 | 範例 int **pp |
|---|---|---|---|
| 指標型別 | 宣告去名 | 指標大小、運算位移、型別檢查 | int** |
| 指向型別 | 宣告去名去左* | 解參考型別、sizeof(*pp) | int* |
| 指標值 | 執行期賦值 | 指向哪塊記憶體 | 0x00401000 |
| 自身記憶體 | 編譯期固定 | 指標變數本身大小、左值性 | 4 bytes |
養成此習慣,可消除 90% 指標相關困惑與缺陷。
系列導航:(一) 指標概念與四要素 | (二) 記憶體管理與野指標防禦 | (三) 指標運算 | (四) 進階應用與陷阱