2012-04-15 18 views

答えて

6

簡単な答えはできないということです。二次元配列は、各行を保持するメモリの連続したブロックです。ポインタへのポインタは、整数を含む別のメモリ位置へのポインタがあるメモリ位置を参照できます。

一方、要素へのポインタを保持する別のデータ構造を作成することもできます(つまり、ポインタの配列を作成し、それらのポインタを各行の先頭に初期化し、ポインタを使用してそのポインタの配列はpointerとなりますが、それはまったく役に立ちませんが、むしろすべてを不必要に複雑にします。

おそらく、配列とポインタはと同じであるという誤解から来ていると思われますが、それらはそうではありません。です。配列は配列の最初の要素へのポインタに崩壊することがありますが、それはかなり頻繁に行われますが、そのポインタの型は最初の要素の型です。二次元配列では、最初の要素の型は基本要素型ではなく内部配列です。

+0

大変ありがとう、配列そのものがポインタだと分かっています 例えばarr [2]のように扱うことができます。 *( arr + 1)= 3 私は同じことを2次元配列で行うことはできますか? arr [3] [2]、私は** arr = 0などと言うことができます...... –

+0

@AhmedZainElDein:いいえ、あなたは間違っており、それはよくある誤解です。配列は、配列から最初の要素へのポインタへの暗黙的な変換があっても、完全に異なる型である最初の要素へのポインタではありません。あなたが本当にそれらが同じものではないことを理解すれば、なぜあなたが求めているものが行えないのか理解しやすくなります。それを見るもう1つの方法は、二次元配列(N * M要素の単一ブロック)のメモリレイアウトを描画し、そのブロック内にポインタがないことを認識しているため、ポインタを作成できません。 –

+0

u私。私はあなたが何を言っているのかというと、私は離れて見つけることができないので、arr [3] [2]へのarrの参照を作ることができないからです。 しかし、それは1次元配列で何がint arr [2]、私は* arr = 0と言うことができます。 @(arr + 1)= 3 –

16

で おかげで、このようなポインタ宣言:

int (*pointer)[3] = array; 

をしかし、これはC++で無限に厄介なです。あなたがあなたの一般目的が何であるかを説明すれば、おそらくあなたはよりよい解決策(ベクトルとその他のものを含む)を見つけることができます。

+0

STLは頭痛の多くを節約します。 – chris

+0

これは私が欲しいものではなく、これは1次元の配列です urの努力に感謝します –

+0

@AhmedZainElDein:あなたが望むものはできません。これは* source *となるものを提供するアプローチです*欲しいです*。 –

関連する問題