2016-09-08 5 views
1

C++プログラムでこの行について混乱します。プログラムのアイデアは、4x4配列が対称かどうかをチェックすることです。コードのこの部分は、私が理解していない2D配列を宣言します。ダブルポインタを使用して2D配列を宣言する

int** array = new int*[n]; 

これとは別の質問がありますが、私が得るのは単なるポインタです。

int *array = new int[n]; 

私はダブルポインタを理解していません。親切に説明してください。

+0

このように考えてみましょう。最初のものは、それぞれがすでに理解している2行目と同じようなものを割り当てることができる 'n'個のポインタの配列を割り当てることです。次に、array [i]によってデータのi番目の "行"にアクセスします。しかし、それは単なるint *です。したがって、array [i] [j] 'を使ってデータの*第j番目の" column "にアクセスすることができます。 – WhozCraig

答えて

3

どのようにして1つのポインタ配列を作成しますか?あなたはこれを行う:

int* myArray = new int[n]; 

これはどういう意味ですか?それは2つの部分を持っています。最初の部分はint*というポインタを予約しています.2番目の部分はn要素を予約していて、それぞれサイズがint(これは配列ですか?)で、その配列のアドレスを取得して保存しますそれは変数myArrayにあります。

これで、配列の配列である2D配列が必要になります。ですから、この新しい配列配列の各要素は、これらのうちの1つです。これをどうやって予約しますか?私たちは行います

new int*[n]; 

私たちは前の話という、タイプint*とそれぞれ、nスロットを予約しているため。

戻り値の型は何ですか?これは、配列の配列、またはだ「配列へのポインタ、後者はまた、配列へのポインタである」、あなたは

(int*)* 

それとも

int** 

としてそれを書くようになりますので、

int** array = new int*[n]; 
+0

"...配列の配列である2D配列" - そのステートメントは正確です。しかし、OPの混乱は、*配列の配列を*ポインタの配列*と混同することによってさらに進化する必要はありません。彼らは**同義語ではありません。後者は統語的な砂糖を前者のように見せますが、彼らは決して同じではありません。私はOPがこれを把握してくれることを願っています。なぜなら、 'int ** ar'が期待される関数に' int [n] [m];として宣言された ' – WhozCraig

+0

@WhozCraig私は物事を体系的に理解できるようにするのが好きです。それが私がそこでやろうとしたことです。 –

+0

@TheQuantumPhysicistあなたの説明は本当に役に立ちました。どうもありがとうございます。 – TheLearner

1

int** arrayintへのポインタへのポインタです。だから、これを行うことによって:

int** array = new int*[n]; 

あなたはnint*ポインタを保持するメモリのセクションを作成し、そのメモリにarrayを指しています。あなたが作成したこれらのポインタのそれぞれについて、そうのようなint秒のセットを作成することが可能である:

for (auto i = 0; i < n; ++i) 
    array[i] = new int[n]; 

たメモリは次のようになります。

array -> [  int*  |  int *  | .... n 
     [int | int | ...][int | int | ...][ ... n 

しかし、これはある、多くのすなわち、もしC++でstd物事のいくつかを使用する場合ははるかに簡単std::vector

std::vector<std::vector<int>> arr(std::vector<int>(0, n), n); 

、あなたが行われてい...

+0

非常によく説明されています。ご協力ありがとうございました。 – TheLearner

関連する問題