Int arr[2][4], *p; p = &arr[0][0];
*(p + 2) = 10; //ok
*(p + 5) = 20;// ok
*(*(arr + 1) + 3) = 15;//ok
*(*(p + 1) + 3) = 15;// error
我不明白爲什麼最後一個給我一個錯誤,之前那個罰款。 p
等於arr
,爲什麼它不起作用?訪問二維數組與指針給出的錯誤
Int arr[2][4], *p; p = &arr[0][0];
*(p + 2) = 10; //ok
*(p + 5) = 20;// ok
*(*(arr + 1) + 3) = 15;//ok
*(*(p + 1) + 3) = 15;// error
我不明白爲什麼最後一個給我一個錯誤,之前那個罰款。 p
等於arr
,爲什麼它不起作用?訪問二維數組與指針給出的錯誤
arr
是int (*)[4]
類型的在表達*(*(arr + 1) + 3) = 15;
和int *
類型的*(arr + 1)
(後數組指針轉換),並且因此引用操作可以在其上被施加。另一方面,p
是int *
的類型。 *(p + 1)
類型爲int
,您無法對其應用解除引用操作符。
將表達式中的數組轉換爲指向其第一個元素的指針。
因此,在表達式(在子表達式arr + 1
)*(*(arr + 1) + 3)
陣列arr
轉換爲int (*)[4]
類型的指針。而子表達式arr + 1
也具有相同的類型。子表達式*(arr + 1)
產生一個類型爲int[4]
的對象,該對象又被轉換爲指向其第一個元素的指針並具有類型int *
。所以,你可能會取消引用該指針像
*(*(arr + 1) + 3) = 15;//ok
指針p
的類型爲int *
所以這個子表達式*(p + 1)
的類型爲int
,不得被進一步解除引用。
比較這些語句的其他
*(p + 2) = 10;
*(*(p + 1) + 3) = 15;
下面寫一個從第一條語句可以看出,*(p + 2)
具有類型int
。因此,取消引用*(p + 1) + 3
的表達式int
也不具有男性意義。
'*(p + 1)'的類型是'Int',而不是指針。所以'*(p + 1)+ 3'不能解引用。 – BLUEPIXY
作爲一個多維數組,'arr'是數組* *的數組。當它衰減到指向其第一個元素的指針時,該指針是一個指向數組的指針('Int(*)[4]')。如果你取消引用這樣一個指針,你會得到一個數組,它本身可以衰減爲一個指針,在本例中爲'Int'。另一方面,變量'p'是一個指向'Int'的指針。你可以取消引用它來得到一個'Int',但是你不能進一步解引用這個結果,因爲它不是一個指針。 –