2017-06-15 19 views
1

の違いは何ですか:new演算子とポインタを持つ2つの異なる宣言の違い

int* a = new int[w]; 

int** b= new int*[w]; 

とまさにこの意味は:int*[w]int[w]は?

+1

'w 'は変数としてではなくconstとして定義する必要があることに注意してください。 – RoiHatam

+0

@RoiHatam:本当ですか?関数の中で、私はそれが本当だとは思わない。可変サイズが許される。 G ++(7.1.0)は、 'g ++ -O3 - と同じようにファイルスコープ(' int w = 6; int * a =新しいint [w]; int ** b =新しいint * [w]; ' g -std = C++ 11 -Wall -Wextra -Werror -pedantic ... '。これは "C++標準で許可されている"と主張するのと同じではありませんが、標準に違反している場合、 '-pedantic'は警告(' -Werror'のためにエラー)を引き起こすはずです。 –

+0

私たちは教習所ではありません。 **特に**は不明ですか? – Olaf

答えて

1
int* a = new int[w] 

この最初の例では、動的にw整数を割り当てます。

int** b = new int*[w] 

第2の例では、wの整数へのポインタを動的に割り当てます。

+0

2番目は、配列の各要素が整数へのポインタであるため、単純にn-D配列を実装するために使用できます。 – EsmaeelE

1

最初のケースでは、w要素を持つintの配列を動的に作成しています。次に、w要素を持つint *の配列を作成します。サイズwint *のアレイ、およびそれぞれのサイズwintの配列:

表記int*[w]int[w]は、上記のタイプです。

+0

int ** b =新しいint * [w]; この場合、intポインタwで2次元行列を作成していませんか? – Alex

+0

@Alex:いいえ。 2D行列を作成していません。 'int'へのポインタの配列を作成しています。それらのポインタのそれぞれを 'int'の配列を指すように初期化すると、2D配列として多かれ少なかれ扱うことができますが、それでも2次元配列(行列)ではありません。 –

+1

@Alex技術的に、いいえ。行列は固定数の行と列を持ちます。ポインタは初期化されていないので、配列ごとにポインタを割り当てる必要があります。これらのサブアレイは、異なるサイズであってもよい。また、ポインタの配列とintの各配列は互いに独立していますが、真の2次元配列は連続しています。 – dbush

関連する問題