ポインタの関数への活用
ポインタの関数への活用方法を紹介します。
今回は、2つの整数型の変数を渡すとその値を交換するMySwap()関数を定義してみましょう。
pointer_function_sample1.c
void MySwap(int x, int y) { int buf = x; x = y; y = buf; }
関数は2つ以上の値を返すことができないので代入するのではなく変の数値を変更することとします。
xにyを代入してしまうと、元々のxの値は消えてしまうのでbufに一時的に保存します。
これを呼び出してみましょう。
pointer_function_sample2.c
int main(void) { int a = 3; int b = 4; printf("a = %d, b = %d", a, b); MySwap(a, b); printf("a = %d, b = %d", a, b); return 0; }
しかし、これを呼び出してみても値は変わりません。
それはなぜでしょうか。
答えは関数へのデータの渡し方にあります。
MySwap()関数にaとbという2つの変数を渡しました。
しかし、関数内で変更を加えているのはaとbではありません。
aとbの値をコピーしたxとyという別の変数を変更しているのです。
そのためコピー元のaとbに変化はありません。
このようなデータの渡し方を値渡しといいます。
ポインタでこれを解決できます。
変数や配列はコンピュータのメモリ上に保存されます。
そのとき保存したメモリ上の位置を示す符号をアドレスといいます。
ポインタとはある変数のアドレスを持つ変数のことです。
それではMySwap()関数を変更してみましょう。
pointer_function_sample3.c
void MySwap(int *x, int *y) { int buf = *x; *x = *y; *y = buf; }
呼び出すときは
MySwap(&a, &b);
とします。
構造体を引数にとる
構造体を引数にとる場合、ポインタで参照することをお勧めします。
構造体に限らずですが、ポインタでない引数を与えた関数が呼び出されたとき、メモリ上にその変数のコピーが生成されます。
変数なら、その程度は問題ありませんが、構造体は複数の変数の集合なので、よりメモリを圧迫します。
ポインタを引数とした場合、コピーされるのはアドレスのみなのでメモリを節約できます。