2012-04-12 20 views
0

私はポインタと配列を理解するのに苦労しています。私は次のプログラムを書いた:配列とポインタ

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 

誰かが私の理解に間違っていますか?

おかげ ダン

+0

"私は要素を期待していました" - 何の要素ですか?配列に名前を付けると、それを推論するのがより簡単になります。 –

答えて

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++; 
} 
+0

ありがとうございました。すべてが今より明確に見えます。 – Dan

1

あなたは、配列の末尾を越えて実行しました。あなたが印刷しようとしているのはおそらくメモリ上にあるものですが、技術的には未定義の動作です。この後の第3要素に

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

点:この後に第二の要素に

int * iptr = new int [4]; 
iptr

点:

iptr

は、4つの要素の配列の最初の要素へのポインタであります:

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

ここにリセットiptrがないので、3番目の要素を指しています。 3に設定

第三要素、::

 
iptr: 3 

4番目の要素を、あなたのプログラムで任意の特定の値に過去

 
iptr: -842150451 

を設定していないので、あなたが印刷

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

ここでは未定義の動作ですが、おそらくあなたの実装は近くのメモリを印刷するだけです。

 
iptr: -33686019 
iptr: 0 
1

ポインタは自動的にあなたが最初にそれらを設定する場所に移動しないでください。あなたは

iptr++; 

を使用した後、それは今、別の一時的なポインタを使用し、ループの場合すなわち要素[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;   
} 
6

をCに初心者として++私はポインタと配列

誰もが今まであなたを与えることができる最高のアドバイスを理解するのに苦労しています。ポインタと配列は単なる努力の価値がありません。 std::vectorまたはstd::arrayのようなC++ツールを使用すれば、あなたの人生は非常に簡単になります。あなたが必要であれば、残りの言語を習得した後に戻ってそれらを学びましょう。

+0

トピックからの逸脱、私はあなたの名前の下にあなたの評判を見ることができましたが、依頼したいのですが、ポインタと配列なしでC/C++が不完全ではありませんか? – howtechstuffworks

+0

@how - おそらく、C++標準ライブラリのパッケージ化された機能を使用できるときは、最も暗いコーナーに直接ダイビングする必要はありません。 –

+1

+1、ポインタを使用しないように指示します。私の初期の時に参考にしたことを誰かに教えてくれただけでは、私の人生の半分を無駄なポインタのことを理解するのに無駄にしていないでしょう。 – ApprenticeHacker