ぷらこのきろく

メモとかテストとか備忘録とか

C言語ポインタの初級者用課題

あっちの方はちょっと休憩。

某所で、プログラムとC言語を勉強し始めた方がおられて、すごくがんばっておられる。
僕も負けてはいられないんだけど、その方向けにちょっとした課題のプレゼント。

その1:値を入れ替える関数を作ってみる

こんなプログラム。

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c;
	/* まず初期値を表示する */
	printf("a=%d, b=%d\n", a, b);

	/* ここから値を入れ替えてみる */
	c = a;
	a = b;
	b = c;
	/* 値がいれかわったかな? */
	printf("a=%d, b=%d\n", a, b);
	return 0;
}

即席で作ったからタイプミスとかあったらごめんなさい。適当に直して。
aとbの値が入れ替わる処理はこんな風に書けます。直接一気に交換する方法…もないことはないらしいんですが、
普通は、退避用の変数(この場合はcですね)をとって、入れ替えを行います。
ということで、この入れ替える処理を関数(名前はとりあえず"swap")にしてみましょう。
まず失敗例。

#include <stdio.h>
void swap(int a, int b)
{
	int c;
	c = a;
	a = b;
	b = c;
	return;
}
int main()
{
	int a = 10;
	int b = 20;
	int c;
	/* まず初期値を表示する */
	printf("a=%d, b=%d\n", a, b);

	/* ここから値を入れ替えてみる */
	swap(a, b);
	/* 値がいれかわったかな? */
	printf("a=%d, b=%d\n", a, b);
	return 0;
}

実行してみたらわかるけど、これは値が入れ替わらないのですね。
なんでかというと、main()関数のaとswap()関数のaは違うものなんです。bももちろん同じ。
そして、main()関数のaの「値」(この場合は10ですね)がswap()関数のaにコピーされて動くので、コピーされたものを入れ替えるだけではコピー元のmain()のaやbには影響はないのです。
そこでどうするか、ポインタなんですね。*1
ポインタで、main()関数のaやbという変数のアドレスの値を渡してあげて、そのアドレスの指す値を入れ替える、そういう関数を作ってください。

*1:マクロの話はとりあえずおいとく