2012-06-12

ポインタ入門

ポインタとは、郵便屋さんのことです。
まずは、次の2つのコードについて理解を深めましょう。

#include <stdio.h>

int main(void)
{
	int *p, q;
	q = 199;
	p = &q;
	printf("%d", *p);
	
	return 0;
}

このコードは、次のように読み替えると非常に分かりやすいです。

あるところに郵便屋さんのpさんと、qさんがいました。
qさんのお家には199がありました。
郵便屋さんのpはqの住所を知りました。
郵便屋さんのpはqのお家に行って、荷物を受け取りました。


次のコードを見てみましょう。

int main(void)
{
	int *p, q;
	p = &q;
	*p = 199;
	printf("qの値は %d", q);
	
	return 0;
}

このコードは、次のように読み替えるといいでしょう。

あるところに郵便屋さんのpさんと、qさんがいました。
郵便屋さんのpはqの住所を知りました。
郵便屋さんのpはqのお家に199を送りました。


簡単にポインタ演算子アスタリスク(*), アンパサンド(&)についてまとめます。
&が変数名の前についたら、変数の住所を知ることが出来ます。
**はポインタ変数に付きますが、2つの使い方があります。
printf("%d", *p);のように用いると、郵便屋のpはあらかじめ手に入れた住所を元にしてその家まで行き、変数の中身を受け取ります。
**p = 199;のように用いると、郵便屋のpはあらかじめ手に入れた住所を元にして、その家に199という荷物を届けます。
**を用いるときはいずれも、p = &q;のように住所を手に入れないと、エラーになります。


では、次の二つの練習問題を解いてみましょう。

・ポインタ変数pを用いて、変数aに格納されている値(123とする)を変数bにコピーするコードを書いてください。

この問題は、次のように言い換えられます。
あるところに、郵便屋さんのpさんと、aさん、bさんがいました。
aさんのお家には123がありました。
郵便屋さんのpさんはaの住所を知りました。
郵便屋さんのpさんはaさんのお家に行き、荷物を受け取り、bさんの家に届けました。

つまり、

#include <stdio.h>

int main(void)
{
	int *p;
	int a, b;
	
	a = 123;
	
	p = &a;
	b = *p;
	
	printf("%d", b);
	
	return 0;
}

というコードになります。


では次の問題に行きましょう。
・forループを使って、0から9までカウントしてその数を表示するプログラム作成してください。数を表示するときポインタを使うものします。

この問題の解答はコードだけを示すので、意味は皆さん自身で考えてください。

解答は

#include <stdio.h>

int main(void)
{
	int i, *p;
	
	p = &i;
	
	for (i = 0; i < 10; i++) {
		printf("%d ", *p);
	}
}

です。

おわり。

はてな記法がわかりません。ソースコードの色づけや、アンパサンドとか、どうすればいいんだろう。

  • ポインタの説明したがる人って、なんで無駄に比喩を持ちだしてくるんだろう。分かりにくいだけだと思うんだけど。 メモリ区画にはメモリアドレスという名前がついてて、ポインタは...

    • ポインタとは、郵便屋さんのことです。 もうここで読む気なくすよね

    • ポインタの何が難しいかって、あれは実装としてはアセンブラで言うところのただの間接アドレス指定に過ぎないのに規格上はそれを前提としていないので説明が抽象的なものにならざ...

    • 本当にそう思う。 変に例え話を出してこれで理解しろって放り投げるんじゃなくて、 面倒でもメモリ内の状態を意識するよう一つ一つ丁寧に説明する方が理解し易いと思う。 馬鹿でも...

  • 俺のポインタ入門 ポインタとは配列の添え字とほぼ同等。 でも何か馴染みにくい。 char *a; があるとしよう。 この時作られたのは変数aなわけ。*aじゃないよ。 aには自然数が入ります...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん