• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++のポインタの動作を教えてください)

C++のポインタの動作を教えてください

このQ&Aのポイント
  • C++のポインタは、変数やオブジェクトのメモリアドレスを格納するためのデータ型です。
  • ポインタを使用することで、メモリ上のデータにアクセスしたり、動的にメモリを確保したりすることができます。
  • 例えば、リストの末尾に要素を追加するときに、tail->next = item; tail = item;と書くことで、要素を追加できます。

質問者が選んだベストアンサー

  • ベストアンサー
  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.3

#1です。 >tail->nextはtailポインタとは関係ないものなんでしょうか? >tail->nextの値はtail自体を変えるとtail->nextも変わってしまうのかなと思っているのですが…。 なんとなく、わからないところがわかりました。 多分、ポインタの概念がまだしっくりときていないのかと思います。 tailというのはポインタなので、実体はありません。 リスト構造の最後のitemを指し示す目印のようなものです。 なので、 >tail=item; というのは、tailの中身を操作するものではなく、tailの指し示しているものを新しいitemに変更するという意味になります。 なので、それまでのtail->nextの値に変化はありませんが、これ以降はtailの指し示す対象が新しいitemになるので、tail->nextで参照すると変わっているように見えます。 それまでのtail->nextが変わっていないのを確認するために、以下のようにしてデバッガで値を確認してみるのもひとつの方法です。 list* oldtail = tail; //ここでtail->nextの値を確認 if(tail)tail->next=item; tail=item; list* a = oldtail->next; //ここで前に確認したtail->nextの値と比較する nextの値に変化が無いのが確認できると思います。 ただ、ちょっと気になったのは教科書的なリスト構造とはちょっと異なっているので、その他のリスト構造のサンプル等も参考にすると良いと思います。 C言語のポインタは実感しにくくつまづく人も多いので、それだけの内容の本も結構あります。 http://www.amazon.co.jp/s/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Dstripbooks&field-keywords=%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF どうしても理解できない場合は評判の良い本を選んで1冊読んでみることをお勧めします。

RJMS
質問者

お礼

実はこのプログラムも勉強しているもので独習C++という本を使ってやっているのですが、いきなりこういうのが出てきてわからないことがあり、質問してみたのですが、詳しく教えていただきありがとうございました。 自分なりの解釈では理解できたと思うのですが、自分の解釈が間違っているかもしれないので、本を読んでみようかと思います。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.2

>tail->nextはtailポインタとは関係ないものなんでしょうか? はい。関係ありません。 >tail->nextの値はtail自体を変えるとtail->nextも変わってしまうのかなと思っているのですが…。 変わりません。 変数の値と、それがポイントするオブジェクトを混同していますね。 市長が山田さんだとします(変数:市長へのオブジェクト:山田のポインタの代入)。 市長さんに子どもが生まれたとして(変数:市長の指すオブジェクトの変化)、その後、市長が田中さんに替わったからと言って(変数へ別のオブジェクトポインタの代入)、山田さんの子ども(さっきのオブジェクト:山田の内容)はそのままです。

RJMS
質問者

お礼

わかりやすく例を出していただいてありがとうございました。 ポインタのことをまた一から勉強しなおそうかなと思っています。

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.1

リストはななめ読みですが、これはリストの一般的な操作方法です。 tailはリスト末尾のポインタを保持していますね? >なぜ、if(tail)tail->next=item; そこにitemを追加しています。 >tail=item; そうすると、tailが指しているポインタはリストの末尾ひとつ前になるので、今追加したitemをリストの末尾として登録してあげているのです。 >tail->nextの内容も変わるのでは? 次に参照した場合はさっき追加した場合のitemがtailになっているので、リストをつなげていくことができます。 item->item ------↑tail が item->item->item ------------↑tail となった感じです。 大ざっぱな説明なので不明なところがあれば補足してください。

RJMS
質問者

お礼

if(tail)tail->next=itemが変数を追加していて、 tail=itemが次の参照のときに、変数を追加するための準備っていうことですかね…。

RJMS
質問者

補足

tail->nextはtailポインタとは関係ないものなんでしょうか? tail->nextの値はtail自体を変えるとtail->nextも変わってしまうのかなと思っているのですが…。

関連するQ&A

専門家に質問してみよう