Hiragi(GKUTH)の日常
理系大学生の日記

ポインタのポインタ

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

ポインタのポインタ

投稿記事 by Hiragi(GKUTH) » 10年前

C言語を最初に触った者が大抵最初にぶち当たるのはポインタです。
メモリを意識した概念なので当時PC初心者の私には全くわかりませんでした。
で、その時は例のこのサイト様のお世話になって、ある程度理解をしたつもりでした。
で、その後DxLibに出会ったりココを見つけたり、或いはC#に触れたりするわけですが、一年ほど前に私はとある質問をしました。

はい、ご存知の通り「ポインタのポインタ」です。(この表現があっているのかわからないが)
苦しんで覚えるC言語様にお世話になった私は殆ど理解が出来ませんでした。
「ポインタ」は「変数の位置」を示すための「識別番号」だという認識だったので、ポインタというものが実際に変数であることが全くわからなかったみたいです。(わかってるかのように書いてあるがどうせ私のこと(ry
当時の私はちゃっかり理解したかのような文を書いてますが、まぁ、どうせ私のことですしうっすら理解してるから理解したということになっていたのでしょう。


で、つい先日ISLeさんのサイトの存在を知り、ポインタについての解説が書かれているページを見つけました。
わかり易い(?)解説で、というかわかりやすいというか正確な所を突いている感じで飲み込みやすいとは思いませんでしたが
何度も読むとうっすらと理解が進んできました。なんというか、先生と生徒の会話も楽しいし。
ポインタも変数なのだからそのポインタ変数を指すポインタも有るんだなーという話だそうです。(まだはっきり理解していないが)


CODE:

int p = 10;
int *pp;
int **ppp;

*pp = &p;
**ppp = &pp;
こいつにおいて
変数*ppは変数pを指す識別番号が入っているポインタ変数であり、
変数**pppは変数*ppの識別番号が入っているポインタ変数であるということなんだということなんでしょう(適当(適当ではいけないッ))

ここで重要なのはポインタ変数*ppが指しているのは変数pの内容ではなく変数pの位置自体で有るということ、
そしてポインタのポインタ変数**pppが指しているのはポインタ変数*ppに入ってる識別番号ではなくて*pp位置自体であるということなんでしょう。
だから当時の私のコードはポインタ変数の識別番号がコピーされただけだから呼び出し側からみたら内容は書き換わらないんだなぁ、と
久しぶりに質問を見たら思ったより理解が進んでいることを実感した次第でした、という話です。


なんとまぁC言語と言うのは難解なものですねぇ...
ISLe様のサイトより引用
>>生徒「この変数にはさっき言った識別番号が格納される」
>>先生「なるほど、ここに話が繋がるのですね」
>>先生「その識別番号のことをポインタと呼ぶ」
>>生徒「あれ?さっき『ポインタを宣言する』と言ったのは変数でしたよね」
>>先生「そうだ。変数もポインタだし、識別番号もポインタだ」
>>生徒「何ですか、それ」
>>先生「言語仕様にすらそのように書いてあるのだから仕方ない。我々が努力して区別するしかない」
>>生徒「ひどい話ですね」

本当にヒドイ話である。

さらに引用
>>先生「ポインタ変数に格納されるのは識別番号だ」
>>生徒「そうですね」
>>先生「変数は値を入れる箱で、識別番号は箱と一対一に対応するものだ」
>>生徒「そうですね」
>>先生「識別番号は箱を指すものだ。識別番号を指す識別番号というものは存在しない」
>>生徒「煙に巻かれた気分です」

つまりそういうことなんでしょう。


もしかしてCとか触らずにプログラミングしてる方とかはこういう理解があまりないのかもしれませんねぇ...(未だ理解してない俺が言うな)
オフトピック
一人称がちらほらと変わる...

アバター
海Sea
記事: 102
登録日時: 14年前

Re: ポインタのポインタ

投稿記事 by 海Sea » 10年前

ポインタは無いにしても、
他の言語でも参照と値渡しの
違いは理解しないといけません。
JAVAなどで、ポインタが内部で使用されていても、
技術者側は、ポインタ自体を意識しなくて済む楽さはあります。
それゆえに、
全ての技術者は言語仕様に振り回される運命なのです。

アバター
lbfuvab
記事: 72
登録日時: 14年前

Re: ポインタのポインタ

投稿記事 by lbfuvab » 10年前

変数:データを格納する家
ポインタ:変数の住所データ
ポンタのポインタ:「変数の住所データ」を格納している住所のデータ

こんな感じでしたっけ?

ISLe
記事: 2650
登録日時: 14年前

Re: ポインタのポインタ

投稿記事 by ISLe » 10年前

宣言時の*は型の一部なので、変数ppとか変数pppと書くのが良いですよ。

変数名というのはプログラミング言語上にデザインされたものなので、デザインされたとおりに使うしかありません。
CPUレベルではシステムメモリの場所を示す方法がアドレスしかないので、それに近い方法を使えるほうが高速な動作を期待できるわけです。
『C言語が』難解というのはちょっと違う気がします。

「C言語のポインタではない『ので難しくない』」というのは他の言語にとっては効果のあるキャッチコピーですよね。
参照先が存在しない状態のある参照というのはいわゆるポインタですが、実際はほとんどの言語にあります。
それがないと拡張性がなくなってしまうからなんですが。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: ポインタのポインタ

投稿記事 by Hiragi(GKUTH) » 10年前

海Sea さんが書きました:ポインタは無いにしても、
他の言語でも参照と値渡しの
違いは理解しないといけません。
JAVAなどで、ポインタが内部で使用されていても、
技術者側は、ポインタ自体を意識しなくて済む楽さはあります。
それゆえに、
全ての技術者は言語仕様に振り回される運命なのです。

現職プログラマの方は現場によって様々な言語を使わなくてはいけないんでしょうねぇ。
なんとまぁ大変そうな感じである。
言語仕様は言語仕様なのだから使う側の我々からしたらどうしようもない...

#昔、友人となければ作ればいいじゃない、と作ったことが有りましたねぇ、まぁ高校受験とか色々の為に現在は無期限凍結中ですが。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: ポインタのポインタ

投稿記事 by Hiragi(GKUTH) » 10年前

lbfuvab さんが書きました:変数:データを格納する家
ポインタ:変数の住所データ
ポンタのポインタ:「変数の住所データ」を格納している住所のデータ

こんな感じでしたっけ?
そうですね、なんかそのままポインタのポインタのポインタとかありそうで怖い。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: ポインタのポインタ

投稿記事 by Hiragi(GKUTH) » 10年前

ISLe さんが書きました:宣言時の*は型の一部なので、変数ppとか変数pppと書くのが良いですよ。
あら、そういえば*は型名でしたっけ、相変わらず理解が曖昧だ。

CODE:

int *p;

CODE:

int* p;
はほぼ同じ意味を持つんでしたっけ、
後者はその後に続けて宣言するとそれらが全てポインタ変数になるとかなんとか。
ISLe さんが書きました: 変数名というのはプログラミング言語上にデザインされたものなので、デザインされたとおりに使うしかありません。
CPUレベルではシステムメモリの場所を示す方法がアドレスしかないので、それに近い方法を使えるほうが高速な動作を期待できるわけです。
『C言語が』難解というのはちょっと違う気がします。

「C言語のポインタではない『ので難しくない』」というのは他の言語にとっては効果のあるキャッチコピーですよね。
参照先が存在しない状態のある参照というのはいわゆるポインタですが、実際はほとんどの言語にあります。
それがないと拡張性がなくなってしまうからなんですが。
まだCPUの速度が十分で無い初期ではCはとても高速とか言われていたそうですね。(いまでも携帯ゲーム機や性能が固定されるコンシューマ機は例外では無いだろうが)
少なくとも私の印象の中では「ポインタ = C言語」みたいになってしまっている感じです。
言語として、開発側が意識する必要があるか否かの問題なのでしょうか。

ISLe
記事: 2650
登録日時: 14年前

Re: ポインタのポインタ

投稿記事 by ISLe » 10年前

int *p;

int* p;
はまったく同じ意味ですよ。
あと
int *p1, p2;
でp2がポインタ型にはなりません。

いまでもJavaの仮想マシンとか.NET Frameworkとかjavascript等のインタプリタとかはみんなC/C++で作られていますね。
セルフコンパイル可能な、他の言語に依存していない言語というのは、他には(もはや)ない感じですし。
C/C++を使いこなせるプログラマがいなくなると世の中のほぼすべてのプログラミング言語が成り立たなくなるのです。
けっして昔話で済むことではないのですけどね。