int x[4][3] = {0};
int (*p)[3]; // 指向「含 3 個 int 的數組」的指針
p = x; // 合法:指針變量可賦值
| 標識符 | 本質 | 可作左值賦值? | 原因 |
|---|---|---|---|
x (二維數組名) | 行指針常量 | 否 | 編譯期固定地址,代表整個數組首地址 |
p (指針變量) | 指針變量 | 是 | 運行期存儲地址,可隨時改變指向 |
int a[3] 中 a 相當於 int *const a(常量指針),指向固定內存塊。int *p 相當於 int *p(指針變量),可指向 a、malloc 內存、其他數組。int (*p)[3] 同理:是指針變量,步長為 3*sizeof(int),可指向任何符合類型的數組首地址。「數組名是常量指針,指針變量才能改。」
聲明時帶 * 且非 [] 形式的,通常是指針變量(除非 const 修飾)。
int *p1[3]; // 指針數組:3 個 int* 元素
int (*p2)[3]; // 數組指針:指向 int[3] 的指針
括號決定結合優先級,**數組指針才是二維數組行指針的正確類型**。