0

C ++の初心者として、ポインターと配列を理解するのに苦労しています。次のプログラムを書きました。

int main (void){
int p[3]={0};
int * iptr = new int [4];

iptr++;
*iptr=2;
iptr++;
*iptr=3;

for (int i=0;i<4;i++){
    cout << "iptr: " << *iptr << endl;
    iptr++;
}

return 0;
}

しかし、期待した結果が得られません。要素 [1] と [2] の値はそれぞれ 2 と 3 になると予想していました。ただし、次の行に沿って結果が得られます。

iptr: 3
iptr: -842150451
iptr: -33686019
iptr: 0

誰かが私の理解のどこが間違っているのか教えてもらえますか?

ありがとうダン

4

4 に答える 4

6

C ++の初心者として、ポインターと配列を理解するのに苦労しています

誰もがあなたに与えることができる最高のアドバイス: しないでください。ポインターと配列は、努力する価値がありません。std::vectorまたはのような C++ ツールを使用するstd::arrayと、あなたの人生は無限に楽になります。必要に応じて、言語の残りの部分を習得した後で戻って学習してください。

于 2012-04-12T16:03:43.453 に答える
5

問題はここにあります:

int * iptr = new int [4];

iptr++;
*iptr=2;
iptr++;
*iptr=3;

を呼び出した後iptr++iptr、配列の先頭を指しなくなります。値を設定したらiptr、元の位置に戻すiptr -= 2か ( )、補助ポインターを使用する必要があります。

したがって、2つの可能な解決策:

iptr++;
*iptr=2;
iptr++;
*iptr=3;

iptr -= 2;

for (int i=0;i<4;i++){
    cout << "iptr: " << *iptr << endl;
    iptr++;
}

または(クリーナー):

int* aux = iptr;
aux++;
*aux=2;
aux++;
*aux=3;

for (int i=0;i<4;i++){
    cout << "iptr: " << *iptr << endl;
    iptr++;
}
于 2012-04-12T15:59:57.070 に答える
1

配列の最後を通り過ぎました。あなたが印刷しているのはおそらくそこのメモリにあるものですが、技術的にはこれは未定義の動作です。

iptr4 つの要素からなる配列の最初の要素へのポインタです。

int * iptr = new int [4];

iptrこの後の 2 番目の要素を指します。

iptr++;
*iptr=2; // set second element to 2

iptrこの後の 3 番目の要素を指します。

iptr++;
*iptr=3; // set third element to 3

ここには resetiptrがないため、まだ 3 番目の要素を指しています。

for (int i=0;i<4;i++){
    cout << "iptr: " << *iptr << endl;
    iptr++;
}

したがって、次のように印刷します。

3 番目の要素、3 に設定:

iptr: 3

プログラムによって特定の値に設定されていない 4 番目の要素

iptr: -842150451

ここで終わりを過ぎると、未定義の動作ですが、おそらくあなたの実装は近くのメモリを印刷しているだけです。

iptr: -33686019
iptr: 0
于 2012-04-12T15:59:37.227 に答える
1

ポインターは、最初に設定した場所に自動的には戻りません。ご利用後

iptr++;

新しいアドレス、つまり element[2] を指すようになりました。

ループの場合は、別の一時ポインターを使用します。元のものをインクリメントしないでください。これを見てください:

int arr[4];

int* iptr = arr;

iptr++; 
iptr = 2;
iptr++; 
iptr = 3;

for (int i=0;i<4;i++){
    cout << "arr: " << arr[i] << endl;        
}
于 2012-04-12T16:02:09.637 に答える