C言語の関数マスター:構造、宣言、ベストプラクティス
関数とは
関数は、一緒にタスクを実行する文のグループです。すべてのCプログラムには少なくとも1つの関数、つまりmain()があり、最も単純なプログラムでも追加の関数を定義できます。
コードを別々の関数に分割できます。コードを異なる関数にどう分割するかは自由ですが、論理的には各関数が特定のタスクを実行するように分割します。
関数宣言は、関数名、戻り値の型、パラメータについてコンパイラに伝えます。関数定義は関数の実際の本体を提供します。
C標準ライブラリはプログラムが呼び出せる多数の組み込み関数を提供します。例:2つの文字列を連結するstrcat()、メモリ位置を別の場所にコピーするmemcpy()など。
関数はメソッド、サブルーチン、手続きなどとも呼ばれます。
関数の定義
Cプログラミング言語における関数定義の一般形式:
return_type function_name(parameter_list) {
body_of_the_function
}
Cでの関数定義は関数ヘッダーと関数本体で構成されます。関数のすべての部分:
- 戻り値の型 - 関数は値を返す場合があります。return_typeは関数が返す値のデータ型です。値を返さずに望む操作を行う関数もあります。この場合、return_typeはキーワードvoidです。
- 関数名 - これが関数の実際の名前です。関数名とパラメータリストが合わせて関数シグネチャを構成します。
- パラメータ - パラメータはプレースホルダーのようなものです。関数が呼び出されると、パラメータに値を渡します。この値を実パラメータまたは引数と呼びます。パラメータリストは関数のパラメータの型、順序、数を指します。パラメータはオプションで、関数にパラメータがない場合もあります。
- 関数本体 - 関数本体には、関数が何をするかを定義する文のコレクションが含まれます。
例
以下はmax()という関数のソースコードです。この関数はnum1とnum2という2つのパラメータを取り、2つのうち大きい方の値を返します:
/* 2つの数値の最大値を返す関数 */
int max(int num1, int num2) {
/* ローカル変数宣言 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
関数宣言
関数宣言は、関数名と関数の呼び出し方についてコンパイラに伝えます。関数の実際の本体は別で定義できます。
関数宣言の構成要素:
return_type function_name(parameter_list);
上記で定義したmax()関数の場合、関数宣言は:
int max(int num1, int num2);
関数宣言ではパラメータ名は重要ではなく型のみ必要なので、以下も有効な宣言です:
int max(int, int);
関数宣言は、あるソースファイルで関数を定義し、別のファイルでその関数を呼び出す場合に必要です。その場合、関数を呼び出すファイルの冒頭で関数を宣言すべきです。
関数の呼び出し
C関数を作成する際、関数が何をするかを定義します。関数を使用するには、定義されたタスクを実行するためにその関数を呼び出す必要があります。
プログラムが関数を呼び出すと、プログラム制御が呼ばれた関数に移ります。呼ばれた関数は定義されたタスクを実行し、return文が実行されるか、関数終了の閉じ括弧に達すると、メインプログラムに制御が戻ります。
関数を呼び出すには、必要なパラメータを関数名とともに渡し、関数が値を返す場合は戻り値を格納できます。例:
Live Demo#include <stdio.h>
/* 関数宣言 */
int max(int num1, int num2);
int main() {
/* ローカル変数定義 */
int a = 100;
int b = 200;
int ret;
/* 最大値を取得する関数呼び出し */
ret = max(a, b);
printf("Max value is : %d\n", ret);
return 0;
}
/* 2つの数値の最大値を返す関数 */
int max(int num1, int num2) {
/* ローカル変数宣言 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
max()をmain()とともに保持し、ソースコードをコンパイルしました。最終実行ファイルを実行すると:
Max value is : 200
関数の引数
関数が引数を使用する場合、引数の値を受け取る変数を宣言する必要があります。これらの変数を関数の仮パラメータと呼びます。
仮パラメータは関数内では他のローカル変数と同様に振る舞い、関数へのエントリ時に作成され、終了時に破棄されます。
関数を呼び出す際、引数を関数に渡すには2つの方法があります:
| 番号 | 呼び出しタイプと説明 |
|---|---|
| 1 | 値渡し 実引数の実際の値を関数の仮パラメータにコピーします。この場合、関数内でパラメータに変更を加えても実引数には影響しません。 |
| 2 | 参照渡し 実引数のアドレスを仮パラメータにコピーします。関数内ではアドレスを使って呼び出しで使用された実際の引数にアクセスします。これにより、パラメータへの変更が引数に影響します。 |
デフォルトでは、Cは値渡しで引数を渡します。一般的に、関数内のコードは関数呼び出しに使用された引数を変更できません。
C言語