« ポインタの理解を妨げるもの 第4回 | トップページ | C言語のお勉強 ポインタ編 第2回 »

2013年5月20日 (月)

C言語のお勉強 ポインタ編 第1回

先生

変数は値を入れる箱だという喩えを聞いたことがあるかい?

生徒

ええ、よくある喩えですね

先生

その箱にアクセスするとき変数名を使うね。例えばこんな具合だ

int i;
i = 100;
printf("%d\n", i);
先生

実はその箱には必ず識別番号が振られている。識別番号は喩えだが

生徒

識別番号ですか?何のために?

先生

もちろん箱にアクセスするためだ

生徒

変数名を使えばいいじゃないですか

先生

名前の無い変数もあるのさ。名前の付いた変数は寿命が決まっているが名前の無い変数にはそのような縛りがない

生徒

何ですか?それ

先生

いまは知らなくていいよ。名前に縛られないメリットは他にもある。要するに便利なのさ

先生

ここからがいわゆるポインタの説明だ

生徒

前置きが長かったですね

先生

大事なことだからね

先生

さっそくだがポインタの宣言はこうだ

int *p;
生徒

はい

先生

このpは変数

生徒

何を当たり前のこと言っているんですか?

先生

ポインタを理解できない理由はそれを当たり前にできないからだからさ

先生

この変数にはさっき言った識別番号が格納される

生徒

なるほど、ここに繋がるのですね

先生

その識別番号のことをポインタと呼ぶ

生徒

あれ?さっきポインタを宣言すると言ったのは変数でしたよね

先生

そうだ。変数もポインタだし、識別番号もポインタだ

生徒

何ですか、それ

先生

言語仕様にすらそのように書いてあるのだから仕方ない。我々が努力して区別するしかない

生徒

ひどい話ですね

先生

識別番号はアドレスと呼ばれることもある

生徒

聞いたことがありますね。アドレスと呼べば区別できるのにどうしてしないのですか?

先生

おそらくだがハードウェアの話との混同を避けたいのだろう

生徒

C言語の話なのに?

先生

世の中には既にポインタの仕組みをハードウェアに喩えた解説で溢れているからな

先生

ポインタにはポインタを入れてやらなければいけない

生徒

意味不明です

先生

変数には値を入れてやらなければいけない

生徒

それなら分かりますが同じことを言っているようには聞こえませんね

先生

ポインタ変数には識別番号を入れる

生徒

識別番号はどうやって取得するんですか?

先生

変数名から箱の識別番号を取得するにはアドレス演算子(&演算子)を使う

生徒

そこはアドレスなんですね

int i;
int *p
i = 100;
p = &i;
先生

このようにアドレス演算子で変数iから識別番号を取得する

生徒

なるほど

先生

識別番号から箱にアクセスする方法も用意されている

生徒

でしょうね

先生

識別番号に間接演算子(*演算子)を使うと箱にアクセスできる

int i;
int *p
i = 100;
p = &i;
*p = 200;
printf("%d\n", i);
printf("%d\n", *p);
先生

間接演算子(*演算子)はポインタ変数にではなく識別番号に働く

生徒

とつぜん何ですか?

先生

間接演算子(*演算子)はポインタ変数にではなく識別番号に働く

生徒

!?

先生

大事なことだから二回言ってみた

|

« ポインタの理解を妨げるもの 第4回 | トップページ | C言語のお勉強 ポインタ編 第2回 »

C/C++」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« ポインタの理解を妨げるもの 第4回 | トップページ | C言語のお勉強 ポインタ編 第2回 »