次のステートメントを検討してください。
int *pFarr, *pVarr;
int farr[3] = {11,22,33};
int varr[3] = {7,8,9};
pFarr = &(farr[0]);
pVarr = varr;
この段階では、両方のポインターがそれぞれの配列アドレスの先頭を指しています。*pFarr については現在 11 を、*pVarr については 7 を調べています。
同様に、*farr と *varr を介して各配列の内容を要求すると、11 と 7 も取得されます。
ここまでは順調ですね。
pFarr++
では、 と を試してみましょうpVarr++
。偉大な。予想どおり、現在 22 と 8 を見ています。
でも今...
上に移動しようとするfarr++
とvarr++
...「インクリメントする引数の型が間違っています」という結果になります。
これで、配列ポインターと通常のポインターの違いはわかりましたが、動作は似ているのに、なぜこの制限があるのでしょうか?
上記のコードで起こったこととは対照的ですが、同じプログラムで次の関数を表面上は正しい方法と別の間違った方法で呼び出すことができると考えると、これはさらに混乱します。 !?
working_on_pointers ( pFarr, farr ); // calling with expected parameters
working_on_pointers ( farr, pFarr ); // calling with inverted parameters
.
void working_on_pointers ( int *pExpect, int aExpect[] ) {
printf("%i", *pExpect); // displays the contents of pExpect ok
printf("%i", *aExpect); // displays the contents of aExpect ok
pExpect++; // no warnings or errors
aExpect++; // no warnings or errors
printf("%i", *pExpect); // displays the next element or an overflow element (with no errors)
printf("%i", *aExpect); // displays the next element or an overflow element (with no errors)
}
配列ポインターとポインターが一部のコンテキストでは同様に動作するが、他のコンテキストでは異なる理由を誰かが理解するのを手伝ってくれますか?
どうもありがとう。
編集:私のような初心者は、このリソースからさらに利益を得ることができます: http://www.panix.com/~elflord/cpp/gotchas/index.shtml