1

動的多次元配列、配列の配列と呼ぶのは適切ですか?

int **mp = 0;

// Create an array of pointers
mp = new int*[6];

// Where each element of type pointer, points to dynamic array.
for (int x = 0; x < 6; x++)
    mp[x] = new int[7];

これを見ると、サイズ 7 の int の配列を指すポインターの配列であると言えます。しかし、動的配列は配列と見なされるのか、それともポインタによって返される単なるメモリのチャックと見なされるのでしょうか?

4

4 に答える 4

2

はい、それらはポインターの配列です。配列の配列は異なります。

// array of 6 pointers into one-dimensional arrays 7 elements each
int** mp = new int*[6];
for (int x = 0; x < 6; x++)
    mp[x] = new int[7];

// array of 6 arrays of 7 elements each (two-dimensional 6x6 array)
// (all dimensions except the 1st must be known at compile time)
int (*mp)[7] = new int[6][7];
// or, more commonly, when all dimensions are known at compile time,
int mp[6][7];

ポインターの配列は、C 言語で実行時に複数インデックスのデータ構造を作成する方法が他にないため、C で一般的に使用されます。

于 2011-05-30T15:49:26.733 に答える
2

私の理解が正しければ、あなたの質問はセマンティクスに関するものです。標準に関する限り、new []配列を作成しますが、最初の要素へのポインターを返します。標準の 5.3.4/5 から:

割り当てられたオブジェクトが配列の場合 ... new 式は、配列の最初の要素 (存在する場合) へのポインターを生成します。

したがって、あなたの場合、私たちが口語的に「配列の配列」と呼んでいるものは、実際にはポインターの配列であり、真に配列の配列である eg とは異なりint x[6][6]ます。

于 2011-05-30T14:40:34.487 に答える
0

実際には、配列を保持する変数は配列の最初の要素へのポインターにすぎないため、配列をポインターと考えています。さらに、配列を指していなくても、任意のポインターでoperator[]を使用できます。その考え方で:

mpは「整数ポインターのチャンク」へのポインターであり、mp[x]は「整数のチャンク」へのポインターです。

さて、これらの「メモリのチャンク」は、私が配列と考えるものなので、次のようになります。

mpは整数ポインターの配列へのポインターであり、mp[x]は整数の配列へのポインターです。

あなたの例では、新しいステートメントごとに 1 つずつ、合計 7 つの配列 (メモリのチャンク) があります。構造体の使用が終わったら、それらのすべてを削除することを忘れないでください。

于 2011-05-30T15:32:30.073 に答える
0

C++ (および C) では、不規則な配列と連続した多次元配列の扱いがまったく異なります。要素へのアクセスは同じように見えますが、内部ではかなり異なります。

void do_something (
    double matrix[3][3],
    double ** ragged_array)
{
    double x = matrix[1][2];
    double y = ragged_array[1][2];
    ...
}

最初のアクセスではポインターを 1 回だけ通過する必要がありますが、2 番目のアクセスでは 2 つのポインターを通過する必要があります。

于 2011-05-30T15:14:41.283 に答える