2017-03-03 15 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 

なぜ最後のものが私にエラーを与え、それ以前のものが良いのか分かりません。 parrと等しいので、なぜ機能しないのですか?エラーを与えるポインタを持つ2次元配列へのアクセス

+2

'*(p + 1)'の型はポインタではなく、 'Int'です。したがって、 '*(p + 1)+ 3'は逆参照できません。 – BLUEPIXY

+1

多次元配列として、 'arr'は配列*の配列です。最初の要素へのポインタに壊れたとき、そのポインタは配列へのポインタです( 'Int(*)[4]')。このようなポインタを逆参照すると、配列自体がポインタに崩壊することがあります。この場合は 'Int'です。変数 'p'は' Int'へのポインタです。それを逆参照して 'Int'を得ることはできますが、ポインタではないので、その結果を逆参照することはできません。 –

答えて

0

arrは(ポインタへの変換配列の後)タイプint *の発現*(*(arr + 1) + 3) = 15;*(arr + 1)タイプint (*)[4]であり、従って、間接参照演算子は、その上に塗布することができます。一方、pint *です。 *(p + 1)intであり、逆参照演算子を適用することはできません。

0

式の配列は、最初の要素へのポインタに変換されます。

したがって(部分式arr + 1における)発現の配列arr*(*(arr + 1) + 3)はタイプint (*)[4]のポインタに変換されます。同様に、サブ式arr + 1も同じ型を持ちます。サブ式*(arr + 1)は、タイプint[4]のオブジェクトを生成し、そのオブジェクトは最初の要素へのポインタに変換され、タイプはint *です。ですから、

*(*(arr + 1) + 3) = 15;//ok 

のように、このポインタデリファレンスポインタpint *を入力したことがありそのため、この部分式*(p + 1)intを入力しており、さらに間接参照することはできません。

は、*(p + 2)intを入力していることがわかる最初の文から他の

*(p + 2) = 10; 
*(*(p + 1) + 3) = 15; 

下の1を書かれたこれらの文を比較してください。したがって、タイプintを持つ式*(p + 1) + 3を逆参照することは男性的に意味がありません。

関連する問題