指標是一種特殊變數,**儲存值被解釋為記憶體位址**。要徹底搞懂一個指標,必須釐清四個維度:
int *ptr1; // 1
char *ptr2; // 2
int **ptr3; // 3
int (*ptr4)[3]; // 4
int (**ptr5)[4]; // 5
(若 4、5 難懂,請參考《如何理解 C/C++ 複雜類型宣告》)
**去掉變數名,剩下的就是指標類型**
| 宣告 | 指標類型 |
|---|---|
int *ptr1; | int* |
char *ptr2; | char* |
int **ptr3; | int** |
int (*ptr4)[3]; | int (*)[3] |
int (**ptr5)[4]; | int (**)[4] |
**去掉變數名與最左邊的 *,剩下的就是指向類型**
| 宣告 | 指向類型 | 說明 |
|---|---|---|
int *ptr1; | int | 解參考得 int |
char *ptr2; | char | 解參考得 char |
int **ptr3; | int* | 解參考得指標 |
int (*ptr4)[3]; | int[3] | 解參考得長度 3 的 int 陣列 |
int (**ptr5)[4]; | int (*)[4] | 解參考得指向長度 4 陣列的指標 |
關鍵作用:指標算術運算(ptr+1)的步長由**指向類型大小**決定。
sizeof(指向類型) 的記憶體區塊。習慣:見到指標必問三句——類型?指向類型?指向哪裡?
sizeof(指標類型) 即可得知。許多劣質教材將兩者混淆,導致讀者前後矛盾、越看越糊塗。**精通指標的關鍵,在於將「類型」這個混淆概念拆解為兩個正交維度**。