- ベストアンサー
**って何でしょう?
はじめまして。C++の勉強をしている初心者です。 あるプログラムを読んでいて分からないところがあったので教えて下さい。(変数名と値は適当です。) #define num 20 int *a; int **b; a = new int [num]; こちらの方は読んでいる参考書(これならわかるC++)に載っていたので、大体分かります。 b = new int * [num]; for (i = 0; i < num; i++) b[i] = new int [5]; これが分かりません。**bとは何でしょうか?検索しようとしても**というのが検索対象にならず検索できませんでした。詳しく解説しているサイトでも良いので教えて下さい。宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
厳密な意味では、ちょっと違うかもしれませんが、 理解しやすくするために以下のように言い換えて みました。 本当は、絵をかければわかりやすいのですが、、、 int *a; 「int型」リスト(配列)の 先頭アドレスをaとする。 ですから、int a[] と同義です。 ※ただし、ここでは配列の実体はなし int **b; 「int型」リスト(配列)の 先頭アドレスを格納するリスト (配列)の先頭アドレスをb とする。 ですから、int b[][] と同義です。 ※ただし、ここでも配列の実体はなし そこで、各実行文を眺めて見ます。 a = new int [num]; 「int型」変数をnum個獲得して、 その先頭アドレスを a に代入。 ここで、aは配列の実体を持ちます。 b = new int * [num]; これは、b = new (int *)[num] と考え れば、「int型」リストの先頭アドレスが 入る領域をnum個獲得して、その先頭 アドレスを b に代入。 ここで、bにnum個の「リストのアドレス」 を格納できる配列が定義されたことに なります。 ですけど、このままではリストのアドレス 用領域が用意されただけですので、 b[i] は実体を持っていません。 b[i] = new int [5]; そこで、ここで各配列に実体をつけて あげます。 ふ~、しんどいですね!? ポインタは、C, C++の'きも'ですので、がんばって みてください。
その他の回答 (2)
「int*」は「intのポインタ」型 「int**」は「「int*」*」であり、「「intのポインタ」のポインタ」型 さらに、「int***」は「「「intのポインタ」のポインタ」のポインタ」型になります。 つまり、際限はありません。 C言語では「任意の型」に「*」を付けると「任意のポインタ」型になるので、「任意の型」がたまたまポインタだったということです。 int a; int *p; int **q; p = &a; // 「int」変数のアドレスを「intのポインタ」変数に代入 q = &p; // 「intのポインタ」変数のアドレスを「intのポインタのポインタ」変数に代入
お礼
ポインタのポインタのポインタのポインタなんて言葉も検索したらありました。実際に使うとなると凄い大変そうです。奥が深いですね。有難う御座いました。
- 6dou_rinne
- ベストアンサー率25% (1361/5264)
**はポインタのポインタです。 ポインタについての理解がすすんでくればわかってきますが。
お礼
ポインタのポインタというのですね。検索したら結構出て来ました。ポインタについては多少習いましたが、ポインタのポインタは初めて聞きました。有難う御座いました。
お礼
プログラムの分かりやすい説明有難う御座いました。Cについては学校で基本を習い、配列を使ったプログラムは良く書くのですが、ポインタは殆ど使用していませんでした。 卒業論文でアプリケーションプログラムを実践しているのでC++が必要になり勉強し始めたのですが、複雑なプログラムを書くにつれコンストラクタやらnewやらdeleteなどの必要性が高くなり、四苦八苦です。ポインタは難しいですがこれから理解を深めていこうと思います。有難う御座いました。