1

この例は、動的に割り当てられた2D配列へのポインターを関数に渡す方法を理解しようとしたときに見ました。

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」はどのようにして正しいアドレスを計算しますか?

4

4 に答える 4

1

ここにあります:
http ://www.eskimo.com/~scs/cclass/int/sx9a.html
http://www.eskimo.com/~scs/cclass/int/sx9b.html

于 2010-10-15T06:26:39.020 に答える
0

計算は必要ありません。関数「zeroit」は「doubleindirection」を介して整数に到達します。

「int**array」は、実際には整数の行列ではありません。それはまさに「整数上のポインタ上のポインタ」であり、より多くの場合、整数のベクトルです。「array[i]」(最初の間接参照)にアクセスすると、「int *」、つまり整数のi番目のベクトルのアドレスを取得します。「array[i][j]」(2番目の間接参照)にアクセスすると、「int」、つまりi番目のベクトルのj番目の整数を取得します。

于 2010-10-15T06:30:03.303 に答える
0

「2D配列」が実際には個々の行へのポインタの配列である場合、行のアドレスを検索してオフセットを適用するだけで、正しいアドレスが計算されます。ただし、これは「2D配列」を実装するための非常に非効率的な方法です。最善の方法は、通常の1次元配列を使用し、乗算と加算を使用して自分でインデックスを計算することですが、C99では、vlaセマンティクスを使用して、コンパイラに実際の2D配列のように処理させることもできます。

于 2010-10-15T06:33:40.673 に答える
0

以下のメモリレイアウト/アドレスを検討する場合:

array     =  |10|11|12|

array[0]  =  |20|21|22|

array[1]  =  |30|31|32|

セル10にはセル20へのポインターが含まれ、セル11には30へのポインターが含まれます。これは二重間接参照と呼ばれarrayます。これはintの配列へのポインターの連続したワード幅シーケンスであり、計算する必要はありません。2つのポインターを逆参照するだけです。

于 2010-10-15T06:33:44.650 に答える