2017-01-21 7 views
1

array [rowSize] [colSize]と書くだけです。もう一つは、newを使って配列へのポインタの配列として宣言しているところです。 (How do I declare a 2d array in C++ using new?から)C++で2D配列を宣言するさまざまな方法は何ですか?

int** ary = new int*[rowCount]; 
for(int i = 0; i < rowCount; ++i) 
    ary[i] = new int[colCount]; 

mallocを使用する必要があります。それ以上はありますか?それぞれの長所と短所は何ですか?実行/処理のスピードはどうですか?

(これは面接の質問です。だから、ちょうど最も最適な方法を示唆よりも、私はこれらの各メソッドは何をすべきか知っている必要があります)

+2

使用 'のstd :: vector'。 '' –

+0

あなたは 'new'でできることは何でも、' malloc'、 'static_cast'、そしていくつかの配置' new'sを使うことができます。 –

+0

@BaummitAugen: 'std :: vector'はそれ自体で非常に良い2次元配列を作成しません。 –

答えて

0

私は完全にここで質問を理解していないが、私が言うことができますあなたは両者の違いをあなたに伝えます。新しい(またはmalloc)を使用すると、変数はスタックから離れたままになります。変数を次のように宣言する場合:

int iarray[10][10]; 

スタックスペースを使用します。新しい演算子を使用することの欠点は、delete []演算子も忘れないようにすることです。これは、各要素がアレイ自体である配列である

+0

あなたは文脈の議論が欠落しています。ファイルスコープのように宣言すると、 'static'存続期間があり、典型的な実装では、スタックではなく' .bss'または '.ibss'セグメントに配置されます。ある関数の中には、自動生存時間があります。これは通常の実装ではスタック上にあります。クラス内では、静的記憶域、スタック、ヒープ、さらに別のオブジェクトの中に置くことができる、格納するクラスのインスタンスの記憶域クラスを取得します。「スタック空間を使用します」とは100%あまりにも単純です。 –

+0

はい、私はそれを簡単に保つように...私はあなたの羽根をフリルしなかったことを願っています。 –

0

は異なる種類がありする

int array[rowSize][colSize]; 

それは次のようである:

typedef int A[colSize]; 
A array[rowSize]; 

sizeof(A)colSize*sizeof(int)sizeof(array)rowSize*sizeof(A)

[3] [3]のためにメモリ内の要素のインデックス:

|0,0|0,1|0,2|1,0|1,1|1,2|2,0|2,1|2,2| 

これは代わりにポインタへのポインタである:

aryが参照できる
int** ary 

ポインタの配列へ 各要素は、intの任意のサイズの配列を参照することができます。 ポインタのサイズはマシンによって異なります。

例では、poinerの配列として初期化されています。その後、その各要素は新しく作成された配列に初期化されます。メモリ内に割り当てられた配列とインデックスより

int** ary = new int*[rowCount]; 
for(int i = 0; i < rowCount; ++i) 
    ary[i] = new int[colCount]; 

rowCount持っており、3と3に等しいcolCount、 :

ご例えば

|0|1|2| ... |0,0|0,1|0,2| ... |1,0|1,1|1,2| ... |2,0|2,1|2,2| 
| | |  ^    ^    ^
| | --------     |     | 
| ----------------------------     | 
------------------------------------------------ 
+0

ユーザー@Lamar Latrellは、今は自分のエディションで同時に拒否されたエディションを作成します。手動で提案された変更を適用します。ありがとう。 – oklas

関連する問題