2011-05-30 15 views
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の整数の配列を指すポインタの配列であると言えます。 しかし、動的配列は配列と見なされたり、ポインタによって返されたメモリのちょうどチャックとも考えられますか?

+0

uhhこれは 'x <6'でなく' x <7'でなければなりません。 'mp [6]'は無効です。 – asveikau

+0

''メモリの配列 'はどういう意味ですか? 'memory'は実体でもオブジェクトでもありません。 – Nawaz

+0

それでも '動的メモリの配列 'は意味をなさないでしょう。 'int of arrays'は意味があり、' array of char * 'は意味があり、' array of std :: vector 'は意味があります。しかし、 'メモリの配列'は、 'memory'というユーザ定義の型を定義しない限り理にかなっていません。 – Nawaz

答えて

2

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

割り当てられたオブジェクトが配列 ある...新しい式は、配列の最初の要素へ ポインタ( もしあれば)が得られます。

あなたの場合、「配列の配列」とは、実際にはポインタの配列です。 int x[6][6]、これは本当に配列の配列です。

+0

本当に配列の崩壊へのポインタはありますかアレイの作成時に変換が行われますか? – user746411

+0

@user:それはあなたが「本当に」という意味に依存します!フードの中で、 'new'のメモリ割り当て部分は' malloc() 'の単なるラッパーです。しかし、意味論的には、標準では配列を作成すると考えています。つまり、そういう意味では、配列間の崩壊と考えることができると思います。 –

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つのポインタを通過する必要があります。

+0

これは100%正しいですが、私はそれが質問に対処しているかどうかはわかりません。 –

0

実際には、配列を保持する変数は配列の最初の要素へのポインタにすぎないので、配列をポインタと考える。さらに、演算子[]は、配列を指していなくても、どのポインタにも使用できます。思考のその行で :

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

さて、これらの「メモリのチャンクは」あなたが持っているので、私は、配列として考えるだろうかです:

MPは、整数ポインタの配列、およびMPへのポインタである[X ]は、整数の配列へのポインタです。

例では、合計の新しい文ごとに1つ、合計7つの配列(メモリのチャンク)があります。 []を削除することを忘れないでください。

+0

"配列を保持する変数は、最初の要素へのポインタに過ぎない"という意味の-1です。 –

+0

私が純粋であるなら、私はあなたに同意するでしょう。しかし、配列を保持しているかどうかについての可変情報から(少なくとも私の知る限りでは)得ることができないという事実は、実際にはそれをポインタと見なすことができます。 – Kanopus

+0

配列とポインタが同じでないいくつかの方法があります。例えば'sizeof'、代入、関数への引渡し、ポインタ算術、' T [] [] 'を' T ** 'などに変換できないという事実を利用しています。 –

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で使用されています。

+0

+1本当に配列の真の配列を取得する方法の良い例です(まあ、それの最初の要素へのポインタ、とにかく)。 –