Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
関数の定義と呼び出し
同じ処理をひとまとめにして名前を付けたものが関数です。関数を定義して呼び出すことで、コードの再利用性と可読性が向上します。C言語では、使用前に関数の存在をコンパイラに知らせる「プロトタイプ宣言」が必要になる場合があります。
構文
// 関数のプロトタイプ宣言(前方宣言)です。
戻り値の型 関数名(引数の型1, 引数の型2, ...);
// 関数の定義です。
戻り値の型 関数名(引数の型1 引数名1, 引数の型2 引数名2) {
処理;
return 戻り値;
}
// 戻り値がない関数は void を指定します。
void 関数名(引数の型 引数名) {
処理;
}
// 引数がない関数は void を明記します(C言語の慣習)。
戻り値の型 関数名(void) {
処理;
return 戻り値;
}
関数定義の要素一覧
| 要素 | 概要 |
|---|---|
| 戻り値の型 | 関数が返す値の型を指定します。何も返さない場合は『void』を指定します。 |
| 関数名 | 関数を識別する名前です。小文字とアンダースコアを使うスネークケースが一般的です。 |
| 引数(パラメータ) | 関数が受け取るデータです。複数ある場合はカンマで区切ります。 |
| return文 | 戻り値を呼び出し元に返して関数を終了します。『void』関数では省略可能です。 |
| プロトタイプ宣言 | 関数の定義より前に使用する場合に必要です。定義より先に型と引数リストを宣言します。 |
サンプルコード
#include <stdio.h>
// プロトタイプ宣言です(定義は main より後に書くため必要です)。
int add(int a, int b);
double average(int scores[], int count);
void print_separator(void);
int main(void) {
// 関数を呼び出します。
int result = add(3, 5);
printf("3 + 5 = %d\n", result); // 『3 + 5 = 8』と出力されます。
int scores[] = {80, 75, 90, 65, 88};
double avg = average(scores, 5);
printf("平均点: %.1f\n", avg); // 『平均点: 79.6』と出力されます。
print_separator(); // 区切り線を出力します。
// 関数を式の中で直接使えます。
printf("10 + 20 = %d\n", add(10, 20));
return 0;
}
// 整数を2つ受け取り、合計を返す関数です。
int add(int a, int b) {
return a + b;
}
// 配列とサイズを受け取り、平均を返す関数です。
double average(int scores[], int count) {
int sum = 0;
for (int i = 0; i < count; i++) {
sum += scores[i];
}
return (double)sum / count;
}
// 戻り値のない関数です。
void print_separator(void) {
printf("--------------------\n");
}
概要
C言語の関数は値渡し(コピー)が基本です。関数内で引数を変更しても、呼び出し元の変数には影響しません。配列は自動的にポインタへ変換されて渡されるため、関数内での変更は呼び出し元の配列に反映されます。配列の要素数も別途渡す必要があります。
呼び出し元の変数を関数から変更したい場合はポインタを使います。ポインタ渡しについては『ポインタの基本』を参照してください。
関数をデータとして扱う「関数ポインタ」については『関数ポインタ』を参照してください。再帰関数(自分自身を呼び出す関数)も同じ構文で定義でき、スタック深度に注意すれば活用できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。