« C言語のお勉強 ポインタ編 第1回 | トップページ | C言語のお勉強 ポインタ編 第3回 »

2013年5月21日 (火)

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

生徒

ポインタは関数呼び出しの実引数を書き換えるのに使うと習いました

先生

ああ、うん、そうだね

生徒

何ですか?その煮え切らない感じ

先生

どうしてポインタを使わないと実引数を書き換えられないのか説明できるかい?

生徒

話を逸らしましたね。ええと、仮引数は実引数のコピーなので仮引数を書き換えても実引数に影響しない…ですよね

先生

そうだ。そのように実引数のコピーが仮引数に代入される仕組みを値渡しと呼ぶ

生徒

そこがポインタだと違うわけですね

先生

違わない

生徒

へ?

先生

違わないのだよ。引数の型がポインタであっても値渡しだ

生徒

どういうことですか?

先生

前回、識別番号の説明をしたろう。識別番号は喩えだが

生徒

ポインタ変数に入るというアレですね。あっ!

先生

気付いたようだね。そうさ。ポインタの場合は識別番号がコピーされる

生徒

そういうことなんですね

先生

君も当たり前を理解できていなかったようだね。嘆かわしいことだ

先生

このコードを見てくれたまえ

生徒

はい

#include <stdio.h>
void do_double(int a)
{
	a *= 2; /* 仮引数を書き換え */
}
void do_triple(int *p)
{
	static int i = 100;
	*p *= 3;
	p = &i; /* 仮引数を書き換え */
	*p *= 3;
}
int main(void)
{
	int a = 10;
	int b = 20;
	int *p = &b;
	do_double(a);
	do_triple(p);
	printf("%d\n", a); /* 10 */
	printf("%d\n", *p); /* 60 */
	return 0;
}
先生

do_double関数の仮引数である変数aと実引数である変数aは別個だ

生徒

仮引数を書き換えても実引数には影響しないですね

先生

do_triple関数の仮引数である変数pと実引数である変数pは別個だ

生徒

仮引数を書き換えても実引数には影響しないですね

先生

どうだ。違うところはないだろう?

生徒

言われれば。どうして違うと思ったのかな

先生

そもそも比べてはいけないものを比べていたのではないかい?

生徒

比べてはいけないもの…ですか

先生

ポインタの最大の利点は識別番号をコピーして代入できることなんだ。実引数を書き換えられるというのは副次的なものさ

生徒

それ以外どのように便利なのか想像できませんが

先生

目的地を言って開ければどこにでも行けるドアがあれば便利だと思ったことはないかい?

生徒

そんなドアが現実にあれば便利でしょうね

先生

ポインタはそういうものさ

|

« C言語のお勉強 ポインタ編 第1回 | トップページ | C言語のお勉強 ポインタ編 第3回 »

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

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

コメント

コメントを書く



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




« C言語のお勉強 ポインタ編 第1回 | トップページ | C言語のお勉強 ポインタ編 第3回 »