Cは、関数内の2Dダイナミックアレイの寸法をどのように知りますか?
-
30-09-2019 - |
質問
ポインターを渡す方法を見つけようとしているときに、この例を見ました。
void zeroit(int **array, int nrows, int ncolumns)
{
int i, j;
for(i = 0; i < nrows; i++)
{
for(j = 0; j < ncolumns; j++)
array[i][j] = 0;
}
}
私はそれを試してみました、そしてそれはうまくいきますが、私は方法がわかりません。関数「Zeroit」は正しいアドレスをどのように計算しますか?
他のヒント
計算は必要ありません。あなたの関数「Zeroit」は、「二重間接」を介して整数に到達します。
「int **配列」は、実際には整数のマトリックスではありません。それはまさに「整数のポインターのポインター」であり、より多くのベクトル、整数のベクトルです。 「Array [i]」(最初の間接)にアクセスすると、「int *」、つまり整数のithベクトルのアドレスが取得されます。 「配列[i] [j]」(2番目の間接)にアクセスすると、「int」、つまりithベクトルのjth整数が得られます。
「2D配列」が実際に個々の行へのポインターの配列にすぎない場合、行のアドレスを調べてからオフセットを適用するだけで正しいアドレスを計算します。ただし、これは「2D配列」を実装するための非常に非効率的な方法です。最良の方法は、通常の1次元アレイを単純に使用して、乗算と追加でインデックスを自分で計算することですが、C99ではVLAセマンティクスを使用して、コンパイラに実際の2D配列のように扱うこともできます。
以下のメモリレイアウト/アドレスを検討する場合:
array = |10|11|12|
array[0] = |20|21|22|
array[1] = |30|31|32|
セル10にはセル20へのポインターが含まれており、セル11には30へのポインターが含まれています。これは二重間接 - と呼ばれます - array
INTの配列へのポインターのシーケンシャルな単語幅シーケンスであり、計算する必要はありません。
所属していません StackOverflow