a 與 &a 數值相同(首地址),但型別不同,導致指標運算語意截然不同。
| 表達式 | 型別 | 意義 |
|---|---|---|
a | int* | 指向首元素的指標 |
&a | int(*)[5] | 指向整個陣列的指標 |
int a[5] = {0,1,2,3,4};
int *p1 = a; // int*
int *p2 = &a; // 警告:型別不匹配,但值相同
printf("%p\n", a); // 0022FF20
printf("%p\n", a+1); // 0022FF24 (+1 * sizeof(int) = +4)
printf("%p\n", &a+1); // 0022FF34 (+1 * sizeof(int[5]) = +20)
a (int*) → [0][1][2][3][4] 每格 4 bytes &a (int(*)[5]) → [0][1][2][3][4] 整體 20 bytes a+1 移動 1 個 int → 指向 a[1] &a+1 移動 1 個陣列 → 指向陣列結尾後(越界)
void foo(int *p) 接收 a;void bar(int (*p)[5]) 接收 &aint a[3][4],a 型別為 int(*)[4],&a 為 int(*)[3][4]sizeof(a) = 20,sizeof(&a) = 指標大小(4/8)int (*p)[5] = &a; // 正確
int *p = &a; // 編譯警告,雖然能跑但語意錯誤
p = a; // 正確
p = &a; // 錯誤:不能將 int(*)[5] 指派給 int*
作者:雷格碼