2017-03-03 36 views
0
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,爲什麼它不起作用?訪問二維數組與指針給出的錯誤

+2

'*(p + 1)'的類型是'Int',而不是指針。所以'*(p + 1)+ 3'不能解引用。 – BLUEPIXY

+1

作爲一個多維數組,'arr'是數組* *的數組。當它衰減到指向其第一個元素的指針時,該指針是一個指向數組的指針('Int(*)[4]')。如果你取消引用這樣一個指針,你會得到一個數組,它本身可以衰減爲一個指針,在本例中爲'Int'。另一方面,變量'p'是一個指向'Int'的指針。你可以取消引用它來得到一個'Int',但是你不能進一步解引用這個結果,因爲它不是一個指針。 –

回答

0

arrint (*)[4]類型的在表達*(*(arr + 1) + 3) = 15;int *類型的*(arr + 1)(後數組指針轉換),並且因此引用操作可以在其上被施加。另一方面,pint *的類型。 *(p + 1)類型爲int,您無法對其應用解除引用操作符。

0

將表達式中的數組轉換爲指向其第一個元素的指針。

因此,在表達式(在子表達式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也不具有男性意義。