dポイントプレゼントキャンペーン実施中!

ポインタ完全制覇、秘伝問答ポインタ編は読了しました。
しかし、ダブルポインタ(便宜上こう書きますが、ポインタのポインタのことです)や
トリプルポインタが出てくると、いきなり分からなくなってしまいます。

アドレスと値の関係を図解してみても、なぜこんな風にする必要があるのだろう?その必然性は?
となってしまい、本質的な理解ができていないと感じています。

関数に渡すときの値渡しと参照渡しについては理解できているつもりです。
ですが、それに、構造体や、構造体のメンバーに文字列がある場合、mallocなどが関わってくると
ゴチャゴチャになっていきなり分からなくなってしまいます。

上記の本は、文字列と配列とポインタあたりは解説してあり、そのあたりは理解しているつもりなのですが、ダブルポインタやトリプルポインタについては明確な記載がありません。

以前の質問で、
http://oshiete.goo.ne.jp/qa/6478987.html
>3次元の構造を持つなら 3次元配列が必要であり, それを動的に確保しようとしたら「ポインタのポインタのポインタ」は自然な発想だと思う.
とご回答を頂いたことがあるのですが、"自然に"だけでなくじっくり考えても理解できていません。
その他のご回答もなぜそのような状況でそのようなポインタの使い方が必要になるのかなど理解出来ないところが多いです。

基礎が大事だというのは十分理解しているつもりですが、
基礎だけでなく、その上のレベルでのポインタの解説や勉強に役立つテキストを教えてください。
なにとぞよろしくお願いいたします。

また、所要のため土日はネットに繋ぐことができませんのでお返事が遅れることをご了承ください。

A 回答 (3件)

webサイトですが分かりやすいと思います。



参考URL:http://www.nurs.or.jp/~sug/soft/tora/index.htm
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

さらっとしか見ていませんが、配列やmallocなどについても書いてあり、
私の求めていたものに近いです。

現場はネット接続できず、動作不良が起こっても持ち込みの本とサンプルコードを書いて
なんとか(誰もよく理解出来ないままに正常に動いているならそれでいいとして)解決
している状況なので、なかなかWebサイトは見る時間が取れませんが、
休日の空いている時間に勉強したいと思います。

ポインタって難しいですよね(私だけかもしれませんが)。
頑張ります。ありがとうございました。

お礼日時:2011/01/28 19:49

あ、すみません書き忘れました。


2次元、3次元配列について、先程のイメージで書くと以下のようになります。
なのでダブルポインタ、トリプルポインタが必要になります。

2次元配列のイメージ
p1 → p[0] → オブジェクト[0]
        オブジェクト[1]
        オブジェクト[2]
        ・・・
  → p[1] → オブジェクト[0]
         オブジェクト[1]
         ・・・
  ・・・

3次元のイメージ
p2 → p1[0] → ・・・
  → p1[1] → ・・・
  → p2[2] → ・・・
  ・・・



すみません、参考テキストのお勧めではなくて申し訳ないです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

いえ、ポインタと多重配列とか構造体とかmallocとかの関係がどういうものなのか
理解出来ていないのでとても助かります^^

お礼日時:2011/02/09 08:08

ダブルポインタ、トリプルポインタについて。



p1 → p → オブジェクト
このイメージで分かりますでしょうか?
「p1はpの実体を指したい場合」があります。
この時、pが頻繁にnewとdeleteを行う場合、以下のようにしてしまうと問題があります。

int *p = new int;
int *p1 = p;
delete p;
p = new int; //この時点でp1はdeleteされたアドレスを指している
これをイメージ化するとこうです。
p
 > オブジェクトA
p1

p - オブジェクトB
p1 - オブジェクトA


つまり最初のイメージ「ポインタpを指すポインタ」が必要になってきます。
int *p = new int;
int **p1 = &p;
delete p;
p = new int;


トリプルポインタも同様に考えていけば良いと思います。
p2 → p1 → p → オブジェクト
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

int **p1 = &p; でポインタpのアドレスをp1に保持しておくと、
その後、pをdeleteしてからnewしても、変わらず同じオブジェクトを指すのでしょうか。

delete p;
p = new int;
は、オブジェクトは別物になるけれど、アドレスは変わらないの…かな?

C++は経験がないのでうまくイメージ出来ていないかもしれませんが、
そういう「ポインタのポインタが必要になる」事例が知れてよかったです。
私の場合、ポインタのポインタが必要になるのは、関数への、ポインタ変数のアドレス渡し、くらいしか経験がないので…。

試行錯誤しつついろいろテストプログラムを書いて勉強したいと思います。
ありがとうございました。

お礼日時:2011/02/09 08:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!