2012-04-03 10 views
0

私はポインタ算術を使用する問題に取り組んでおり、この小さなコードスニペットが機能することを発見しました。私はそれが何をしているのか正確には分かりません。私には、バッファのアドレス+ ix3の値を配列要素a [i]に割り当てるように見えます。私はなぜそれが私のプログラムに関連するだろうか分からない。誰かがこのループで何が起こっているか正確に教えてもらえますか?私が困惑した基本的なポインタ算術

int *buffer=new int[5*3]; 

for (i=0;i<5;i++) 
    a[i] = buffer+i*3; 
+0

どのように「機能する」のですか?とても珍しいのは何ですか? – cnicutar

+0

変数aの型を追加する必要があります。整数へのポインタの配列でなければなりません。これを念頭に置いて、プログラムの詳細を理解するのに役立つかもしれません。 aの型がintergerポインタの配列のようなものでない場合は、より多くのコードを表示することができます。 – harper

+0

@harper aは変数リストでint ** a;として定義されています。プログラムの後半に2D配列として機能します。 – adohertyd

答えて

2

表現

buffer+i*3 

ので、あなたの仮定が正しい、と私はa[]は、ポインタの配列であることを願っています

&buffer[i*3] 

と同じです。

buffer+kようなポインタ演算ががbufferに含まれるアドレス値を取り、それにKを追加ない注:代わりに、*バッファー+ Kに含まれるアドレス値に等しくすべき、&buffer[k]の値に等しいですはsizeof (バッファによってポイントされるタイプ)。

+0

ありaはint ** aとして定義されています。私の変数リストにあり、後でプログラムで2D配列として機能します。私はaのすべての値を連続したメモリブロック(バッファ)に書きたいと思います。これは私が見た解決策では理解できなかったコードの唯一の行でした。私はこれがどのように動作するかを100%確信していません – adohertyd

+0

'a'の値は、' new'で割り当てられた連続したメモリブロックに既にあります。 – Kleist

+0

いいえ、私は、アダプターが明らかにしたように、aのタイプがポインターの配列であることを願っています。 –

0

buffer+i*3;は、&buffer[i*3];を実行する単なるラウンドアバウトの方法です。

2

あなたの言ったとおりです。配列a(あなたが指定しなかったもの)はおそらくタイプint* [5]です。

この目的は、通常のインデックス作成を有効にすることです(つまり、常にインデックス演算を行わずに)。これを見るには、a[1][2]にアクセスするとどうなるか考えてみてください。上記ルー​​プ後、a[1]それがbuffer要素を指し値buffer + 3、すなわち、含み(ポインタにnを追加するポインタを前進n要素を移動させます)。したがって、a[1][2]は、(buffer+3)[2]と同じです。これは、buffer+3が2つ以上の値にアクセスする場合、つまりbuffer[5]に相当します。 (iはもちろん、4よりも大きい場合を除き、ウェル)

は、より一般的には、この初期化した後a[i][k]buffer[3*i+k]と同じ構成要素にアクセスします。

関連する問題