メモリを意識した概念なので当時PC初心者の私には全くわかりませんでした。
で、その時は例のこのサイト様のお世話になって、ある程度理解をしたつもりでした。
で、その後DxLibに出会ったりココを見つけたり、或いはC#に触れたりするわけですが、一年ほど前に私はとある質問をしました。
はい、ご存知の通り「ポインタのポインタ」です。(この表現があっているのかわからないが)
苦しんで覚えるC言語様にお世話になった私は殆ど理解が出来ませんでした。
「ポインタ」は「変数の位置」を示すための「識別番号」だという認識だったので、ポインタというものが実際に変数であることが全くわからなかったみたいです。(わかってるかのように書いてあるがどうせ私のこと(ry
当時の私はちゃっかり理解したかのような文を書いてますが、まぁ、どうせ私のことですしうっすら理解してるから理解したということになっていたのでしょう。
で、つい先日ISLeさんのサイトの存在を知り、ポインタについての解説が書かれているページを見つけました。
わかり易い(?)解説で、というかわかりやすいというか正確な所を突いている感じで飲み込みやすいとは思いませんでしたが
何度も読むとうっすらと理解が進んできました。なんというか、先生と生徒の会話も楽しいし。
ポインタも変数なのだからそのポインタ変数を指すポインタも有るんだなーという話だそうです。(まだはっきり理解していないが)
こいつにおいて
変数*ppは変数pを指す識別番号が入っているポインタ変数であり、
変数**pppは変数*ppの識別番号が入っているポインタ変数であるということなんだということなんでしょう(適当(適当ではいけないッ))
ここで重要なのはポインタ変数*ppが指しているのは変数pの内容ではなく変数pの位置自体で有るということ、
そしてポインタのポインタ変数**pppが指しているのはポインタ変数*ppに入ってる識別番号ではなくて*pp位置自体であるということなんでしょう。
だから当時の私のコードはポインタ変数の識別番号がコピーされただけだから呼び出し側からみたら内容は書き換わらないんだなぁ、と
久しぶりに質問を見たら思ったより理解が進んでいることを実感した次第でした、という話です。
なんとまぁC言語と言うのは難解なものですねぇ...
ISLe様のサイトより引用
>>生徒「この変数にはさっき言った識別番号が格納される」
>>先生「なるほど、ここに話が繋がるのですね」
>>先生「その識別番号のことをポインタと呼ぶ」
>>生徒「あれ?さっき『ポインタを宣言する』と言ったのは変数でしたよね」
>>先生「そうだ。変数もポインタだし、識別番号もポインタだ」
>>生徒「何ですか、それ」
>>先生「言語仕様にすらそのように書いてあるのだから仕方ない。我々が努力して区別するしかない」
>>生徒「ひどい話ですね」
本当にヒドイ話である。
さらに引用
>>先生「ポインタ変数に格納されるのは識別番号だ」
>>生徒「そうですね」
>>先生「変数は値を入れる箱で、識別番号は箱と一対一に対応するものだ」
>>生徒「そうですね」
>>先生「識別番号は箱を指すものだ。識別番号を指す識別番号というものは存在しない」
>>生徒「煙に巻かれた気分です」
つまりそういうことなんでしょう。
もしかしてCとか触らずにプログラミングしてる方とかはこういう理解があまりないのかもしれませんねぇ...(未だ理解してない俺が言うな)
オフトピック
一人称がちらほらと変わる...