指針是 C/C++ 靈活與危險並存的利器。搞懂指針,必須從四個維度建立清晰心智模型:**指針類型、指向類型、指針值(地址)、指針自身佔用的記憶體**。本文逐一拆解。
(1) int *ptr;
(2) char *ptr;
(3) int **ptr;
(4) int (*ptr)[3];
(5) int *(*ptr)[4];
口訣: 去掉聲明中的指針變量名,剩下的就是指針類型。
| 聲明 | 指針類型 |
|---|---|
int *ptr; | int * |
char *ptr; | char * |
int **ptr; | int ** |
int (*ptr)[3]; | int (*)[3] |
int *(*ptr)[4]; | int *(*)[4] |
指針類型決定了:sizeof(ptr)、指針能參與的運算、作為參數傳遞時的匹配規則。
口訣: 去掉變量名及其左邊的 *,剩下的就是指向類型。
| 聲明 | 指向類型 |
|---|---|
int *ptr; | int |
char *ptr; | char |
int **ptr; | int * |
int (*ptr)[3]; | int [3] (長度為 3 的 int 數組) |
int *(*ptr)[4]; | int *[4] (長度為 4 的 int* 數組) |
關鍵作用:
sizeof(指向類型)。*ptr 的結果類型、佔用字節數。void* 可隱式轉任何指向類型)。sizeof(指向類型)。sizeof(指針類型) 即為指針變量本身佔用的棧/數據區空間。每遇到一個指針,問自己三個問題:
sizeof、參數匹配)int *p; // 類型 int*,指向 int
int **pp; // 類型 int**,指向 int*
int (*pa)[3]; // 類型 int(*)[3],指向 int[3]
int *pa2[3]; // 類型 int*[3] (數組),指向 int* (數組元素)
區分二者是精通指針的**分水嶺**,請反覆研讀聲明語法直到肌肉記憶形成。
指針四屬性緊扣:
下一篇將深入講解指針算術運算的奇妙世界。