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:マクロの話はとりあえずおいとく