今回は《swap関数を作成しよう》というテーマで記事をまとめます。
「swap関数」とは値の入れ替えを行う関数です。値の入れ替えは様々なシーンで使用されるので、しっかり学んでいきましょう!
尚、現在執筆中のC言語入門記事は以下の人を対象としています。
- プログラミング未経験の人
- C言語プログラミングの学習をこれから始めたい人
- C言語プログラミングの学習を始めたばかりの人
また、本記事で作成するswap関数ではポインタを利用します。ポインタの実用例となる為、ポインタの理解度が向上すると思われます。ポインタの経験値が少ない人にとっては一読の価値ありです。
swap関数を作成しよう
swap関数とは
swap関数とは変数の値の入れ替えを行う関数の総称です。
世界的に標準的な名前となっており、世の中のすべてのプログラマは「swap関数=値の入れ替え関数」という認識を持っていると言っても過言ではありません。
値の入れ替えロジック
C言語では(というかほとんどの言語では)、次のようなコードでは値の入れ替えは行うことができません。
int a = 10; int b = 20; a = b; b = a;
それはなぜか? 単純ですね。
4行目( a = b; )が実行された際にaの値が20となる為、5行目( b = a; )を実行するとbには20が代入されてしまうからです。(本当は10を代入したい)
変数が2つでは入れ替えが行うことができない?
そう、変数が2つだけでは値の入れ替えは行うことができません。一時的に値を格納しておく変数をもう1つ用意する必要があります。
コードにすると次のようになります。
int a = 10; int b = 20; int tmp = 0; tmp = a; a = b; b = tmp;
※補足※
一般的に、今回のような「一時的に値を格納しておく変数」のことを『テンプ変数(Temporaryの略)』と呼びます。
変数名には次のようなものが使用されることが多いです。
- tmp
- temp
- t
swap関数の実装【ポインタを使用】
まずは、ここまで学んだことを使ってswap関数を作ってみましょう。
何も考えずに関数化してもダメ!
値の入れ替えロジックをそのまま移植してswap関数を次のようになると思います。
#include <stdio.h> void swap(int a, int b); void main() { int num1 = 10; int num2 = 20; printf("## BEFORE ## num1 = %d, num2 = %d\n", num1, num2); swap(num1, num2); printf("## AFTER ## num1 = %d, num2 = %d\n", num1, num2); } void swap(int a, int b) { int tmp = a; a = b; b = tmp; }
実行してみると、swap関数呼び出し前後でnum1とnum2の値が変わっていませんね。これでは「変数の値の入れ替え関数」としては不十分と言えます。
なぜ、num1とnum2の値が入れ替わらなかったのでしょう?
答えは簡単です。仮引数の値を変更しても実引数の値は変更されないから、です。
仮引数/実引数の関係性を忘れてしまった方は下記記事を参照ください。
別の関数で定義された変数を更新するには?
別の関数で定義された変数を更新するにはどうしたらよいでしょう?
そう、ポインタを使用すればよいのです。
具体的な使用例としては、関数の引数をポインタにします。関数の引数をポインタにすることで、別の関数で定義された変数を参照することができるワケです。
ポインタ未習得の方は下記記事を参照ください。
swap関数の引数にポインタを使用すると、次のようになります。
#include <stdio.h> void swap(int* a, int* b); void main() { int num1 = 10; int num2 = 20; printf("## BEFORE ## num1 = %d, num2 = %d\n", num1, num2); swap(&num1, &num2); printf("## AFTER ## num1 = %d, num2 = %d\n", num1, num2); } void swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; }
今度のコードでは、swap関数の呼び出し前後でnum1とnum2の値が入れ替わりましたね!
これにて、swap関数の作成は完了です。
まとめ
今回は、変数の値の入れ替えを行う「swap関数」について学びました。
変数の値の入れ替えはプログラムコード上の随所で行われる可能性が高い為、関数化することが望ましいと考えられます。
また、関数化するにあたってポインタを使用する必要がありましたね。
ポインタは重要な技術なので理解度に自信がない方は改めて学習し直すことをオススメします。