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次元配列へのアクセス
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次元配列へのアクセス
arr
は(ポインタへの変換配列の後)タイプint *
の発現*(*(arr + 1) + 3) = 15;
と*(arr + 1)
タイプint (*)[4]
であり、従って、間接参照演算子は、その上に塗布することができます。一方、p
はint *
です。 *(p + 1)
はint
であり、逆参照演算子を適用することはできません。
式の配列は、最初の要素へのポインタに変換されます。
したがって(部分式arr + 1
における)発現の配列arr
*(*(arr + 1) + 3)
はタイプint (*)[4]
のポインタに変換されます。同様に、サブ式arr + 1
も同じ型を持ちます。サブ式*(arr + 1)
は、タイプint[4]
のオブジェクトを生成し、そのオブジェクトは最初の要素へのポインタに変換され、タイプはint *
です。ですから、
*(*(arr + 1) + 3) = 15;//ok
のように、このポインタデリファレンスポインタp
がint *
を入力したことがありそのため、この部分式*(p + 1)
はint
を入力しており、さらに間接参照することはできません。
は、*(p + 2)
はint
を入力していることがわかる最初の文から他の
*(p + 2) = 10;
*(*(p + 1) + 3) = 15;
下の1を書かれたこれらの文を比較してください。したがって、タイプint
を持つ式*(p + 1) + 3
を逆参照することは男性的に意味がありません。
'*(p + 1)'の型はポインタではなく、 'Int'です。したがって、 '*(p + 1)+ 3'は逆参照できません。 – BLUEPIXY
多次元配列として、 'arr'は配列*の配列です。最初の要素へのポインタに壊れたとき、そのポインタは配列へのポインタです( 'Int(*)[4]')。このようなポインタを逆参照すると、配列自体がポインタに崩壊することがあります。この場合は 'Int'です。変数 'p'は' Int'へのポインタです。それを逆参照して 'Int'を得ることはできますが、ポインタではないので、その結果を逆参照することはできません。 –