0

動的な2D配列を作成する必要があります。以下のコードを試してみました。

と仮定a=512 and b =102します。これで、作成された2次元配列はですary[512][102]。今、私はベースロケーションへのポインタを作成しています。int *ptr=&(ary[0][0]);

ここで、ポインタにオフセット102を指定している場合、つまりptr+=102、&(ary [1] [0])を指している必要がありますが、を指していません。104のオフセットが与えられた場合、それだけがを指し&(ary[1][0])ます。なぜ余分な2オフセットが必要なのですか????

コードスニペット:

int** ary;
ary= new int*[a];
for(int i = 0; i < a; ++i)
ary[i] = new int[b];
4

3 に答える 3

0

コードが示唆するように、2次元配列は動的に割り当てられるため、この2次元配列のアドレスは連続していないため&(ary[0][0])+102、返されるポインターが次の行であることを認めることはできません。したがって、この場合、単に使用する必要があります&(ary[1][0])

于 2012-12-18T04:10:02.887 に答える
0

この場合、2 次元配列は実際のメモリでは必ずしも線形ではありません。したがって、メモリが線形であると仮定してプログラムを書くことはできません。
104 が ary[1][0] を指す理由は、境界整列である可能性があります。ランタイム システムは、ary[i] に 102 ではなく 104 バイトを使用することを選択します。

于 2012-12-18T04:32:06.807 に答える
0

2D 配列の静的割り当てとは異なり、multiple を使用すると、アドレスは配列全体で連続しませんnew。代わりにnew()、2D 配列の行を作成するために呼び出すと、それぞれの新しい配列は、ヒープから割り当てられたまったく無関係なアドレスを返します。したがって、行の要素にアクセスしたり、行の要素にアクセスしたりするために使用する必要がありary[n]ます。 (n + 1)thary[n+1](n+2)th

于 2012-12-18T04:33:38.690 に答える