1

私は現在、C++ コードのいくつかの古い大学のスニペットを閲覧しています。当時、他のクラスの 1 つは、二重ポインタと 2D 配列を使用して行列クラスを実行するように割り当てられていました。幸いなことに(または後から考えると不運なことに)、そのようなことを学ぶ機会はありませんでした. 将来のレビューのために卒業したときに彼らのコードを借りました。誰かがこのスニペットで正確に何が起こっているのか説明してください:

  //This is a constructor of a 1x1 matrix
  signal::signal(){
     _nrows = 1;
     _ncols = 1;
     _coef = new double*[_nrows];
     _coef[0] = new double[_ncols];
     _coef[0][0] = 0.0;
  }

補足として、_coef は double 型の ** です。

私が理解していることから、_nrows と _ncols には 1 の値が与えられます (サイズを意味します)。次に、コードは、要素が _nrows に等しい double* out をヒープに動的に作成します。問題は、次に何が起こるか正確にはわからないということです。_ncols に対応する配列がポインタではないのはなぜですか? _coef[0] が割り当てられているのはなぜですか?

4

2 に答える 2

2

メモリ内では、2 次元配列 (n, m) は多かれ少なかれ次のようになります。

_coef -> | _coef[0] -> {1, 2, 3, ..., m}
         | _coef[1] -> {1, 2, 3, ..., m}
         | _coef[2] -> {1, 2, 3, ..., m}
         | ...
         | _coef[n] -> {1, 2, 3, ..., m}

_coefポインターの配列をn指します。mそして、これらのポインターはそれぞれdoubleの配列を指します。

したがって、あなたの場合_coef、1 ポインターの配列を指し、このポインターは 1 つの double の配列を指します。

今あなたの質問に

  1. 2 番目の次元では、最終的にポインターではなく double を格納する必要があるため、ポインターではありません。
  2. _coef[0]これは、2 次元配列の最初で唯一の行であるため、 に割り当てられます。
于 2012-12-02T16:49:32.057 に答える
1

あなたが言うように、最初の 2 行では、 と のそれぞれに値を1割り当てます。_nrows_ncols

double*次の行は、 (へのポインタ)の配列を動的に割り当てますdoubledouble*割り当てられたオブジェクトの数は_nrows1あなたの場合です)です。double* array[1]この構文は、要素数が である通常の自動配列 を定義するのと同じように考えてください1。次に_coef、これらのポインターの最初へのdoubleポインターです。メモリ表現を図式的に表します。

_nrows = 1
_ncols = 1
_coef  ---> _coef[0] ---> Currently points nowhere in particular

これで、メモリに並べられた_nrows量ができました。はそれらの最初のものを指します。今回はs の新しい動的に割り当てられた配列が、サイズ で作成されます。それらの最初の へのポインタが に割り当てられます。つまり、最初に動的に割り当てられた配列の最初の要素が、2 番目に動的に割り当てられた配列の最初の要素を指すようになります。double*_coef[0]double*double_ncolsdouble_coef[0]double*double

_nrows = 1
_ncols = 1
_coef  ---> _coef[0] ---> _coef[0][0]

次に、動的に割り当てられた 2 番目の配列_coef[0][0] = 0.0の最初の配列を に設定します。のみなので、動的に割り当てられた配列の両方のサイズが であるため、すべての を 0 に初期化しました。double0 double1double

_nrows = 1
_ncols = 1
_coef  ---> _coef[0] ---> _coef[0][0] = 0
于 2012-12-02T16:48:18.577 に答える