☜前の章へ for文で繰り返し処理や無限ループをする方法
☞次の章へ 配列とは
- 関数とは
- 関数を使うメリット
- 関数の定義と呼び出し方
- 引数と戻り値とは
- 引数があるない等パターン別の関数の書き方
- グローバル変数とローカル変数とは
- プロトタイプ宣言の書き方と必要性
- 標準ライブラリ関数とは
ここでは、C言語の関数の基本的な使い方について学ぶことが出来ます。
引数あり、戻り値なしなどパターン別の書き方も分かるようになります。
関数とは
関数とは処理の塊であり、特定の機能を提供するものです。
例えば、面積の計算など特定の機能を提供する関数を作成することができます。
関数を使うメリット
例えば、プログラムの中で同じ計算を何度も行いたい場合、何回も同じ計算を書くのは非効率です。
関数を使用すれば、効率的にソースコードを書くことが出来ます。
足し算を連続で100回行う一連の処理をプログラム中の5か所に加えたい場合、関数を使わなければ、足し算の式を500回書く必要があります。
しかし、足し算を連続で100回行う一連の処理を、例えば「calc()」という関数名で、関数という1つの機能としてまとめれば、「calc();」と関数名を5回書くだけで済みます。

処理を関数という形で1つの塊にすれば、プログラム中でその処理を使用したい場所に、関数名を書くだけで、処理を実行できるというメリットがあります。
関数の定義と呼び出し方
#include <stdio.h>
//四角形の面積を求める関数(戻り値あり)
//calcSquare(int x, int y)のxとyのことを引数という
int calcSquare(int x, int y) {
//四角形の面積を求める
int area = x * y;
//returnの後のareaのことを戻り値という
return area;
}
int main() {
printf("%d", calcSquare(2, 3));
return 0;
}出力結果

今回は例として、関数「calcSquare()」を作成しました。
calcSquare(int x, int y)の左に書かれているintは戻り値の型を表しています。
戻り値とは、関数を呼び出した箇所に、関数から渡す値のことです。戻り値と返り値は同じ意味ですが、戻り値の方が一般的な呼び方です。(余談:ちょっと上の年齢の人の前で返り値と言うと、なにそれと言われることがあります)
戻り値は「return」の後に書きます。
今回は四角形の面積が入っている変数areaを戻り値として、関数を呼び出した箇所に渡しています。出力結果が6になりましたが、6が戻り値です。
関数はプロトタイプ宣言をしない場合、main関数より前で定義する必要があります。プロトタイプ宣言については後程解説します。
引数に「int x」と「int y」を定義しています。引数とは関数を呼び出す時に、関数に渡すデータのことです。
関数「calcSquare()」には、呼び出し時に引数としてint型の値を2つ渡す必要があります。
「calcSquare(2, 3)」の2と3が引数です。引数である変数xと変数yは関数内で使用することができます。
関数の呼び出し自体は「calcSquare(2, 3)」が該当します。
関数の書き方が分かったところで、先ほどのメリットを再確認してみましょう。
#include <stdio.h>
void sampleFunction() {
int num = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1;
printf("%d\n", num);
}
int main() {
// 関数を使わないとソースコードを無駄に書く必要がある
int num1 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1;
printf("%d\n", num1);
int num2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1;
printf("%d\n", num2);
int num3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1;
printf("%d\n", num3);
int num4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1;
printf("%d\n", num4);
int num5 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1;
printf("%d\n", num5);
printf("-----------\n");
// 関数を使えば上記と同じことが簡単に行える
sampleFunction();
sampleFunction();
sampleFunction();
sampleFunction();
sampleFunction();
return 0;
}関数を使うことで無駄な記述を減らせることが分かります。
関数の基本的な書き方と使い方
①引数なし、戻り値なし
#include <stdio.h>
void sampleFunction() {
printf("関数が呼び出されました。");
}
int main(void) {
sampleFunction();
return 0;
}出力結果

戻り値がない場合は、戻り値の型を「void」にします。
引数なし、戻り値なしの関数は固定の処理を行いたい場合に有効です。
②引数あり、戻り値なし
#include <stdio.h>
void sampleFunction(int num) {
printf("%d", num);
}
int main(void) {
sampleFunction(5);
return 0;
}出力結果

関数の呼び出し時に引数を関数に渡しますが、直接値を書いても良いですし、変数を書いても良いです。
③引数なし、戻り値あり
#include <stdio.h>
int sampleFunction() {
return 5;
}
int main(void) {
printf("%d", sampleFunction());
return 0;
}出力結果

戻り値は、直接値を書いても良いですし、変数を書いても良いです。
④引数あり、戻り値あり
#include <stdio.h>
int sampleFunction(int x, int y) {
int sum = x + y;
return sum;
}
int main(void) {
int num1 = 2;
int num2 = 5;
printf("合計は%d", sampleFunction(num1,num2));
return 0;
}出力結果

引数には、変数を指定することもできます。
グローバル変数とローカル変数とは
#include <stdio.h>
// 変数globalはグローバル変数
int global = 5;
// 四角形の面積を求める関数
int calc_square(int x, int y) {
// 変数areaはcalc_square()のローカル変数
int area = x * y;
// 変数globalはグローバル変数だからどこでも使える
printf("グローバル変数の値は%dです。\n", global);
return area;
}
int main(void) {
// 変数globalはグローバル変数だからどこでも使える
printf("グローバル変数の値は%dです。\n", global);
// 変数areaはcalc_square()のローカル変数だから使えない
// printf("%d\n", area);
return 0;
}グローバル変数globalは、関数の外で宣言されており、calc_square()とmain()2つの関数内で使用可能です。このようにグローバル変数はどこでも使用が可能です。
一方ローカル変数とは、関数calc_squareの場合、areaがそれにあたります。ローカル変数は宣言された関数内でのみ使用することが出来ます。
プロトタイプ宣言の書き方と必要性
プロトタイプ宣言の書き方
先ほどは、関数はmain関数の前に書いていましたが、プロトタイプ宣言を行うことで、main関数の後ろに関数を記述することができる様になります。
プロトタイプ宣言はmain関数よりも前で宣言します。
#include <stdio.h>
//プロトタイプ宣言
int calc(int x, int y);
int main(void) {
printf("関数calcの戻り値は%dです。\n", calc(4, 4));
return 0;
}
int calc(int x, int y) {
int a = x * y;
return a;
}この様に、関数の記述はmain関数の後ろに記述し、プロトタイプ宣言は関数の最初の部分、今回で言うと、int calc(int x, int y);を記述します。
プロトタイプ宣言の必要性やメリット
プロトタイプ宣言を使用すると、関数がどのように使用されるかに関する情報がコンパイラに提供されます。そして関数が誤って使用されている場合、コンパイラがエラーを検出してくれます。
例えば関数の引数の型や数が違う場合などです。
また、ソースコードの先頭やヘッダファイルでプロトタイプ宣言をするため、まとまったプロトタイプ宣言を見ることで関数の概要を理解しやすくなります。
関数がどのような引数を受け取り、何のデータ型の値を返すかが明確になるため、可読性が向上します。
C言語を学習するだけの場合や小規模のソースコードの場合はプロトタイプ宣言は必須ではなく、省略しても問題ありませんが、使用することに慣れておくと良いでしょう。
標準ライブラリ関数とは
標準ライブラリ関数とは、C言語にあらかじめ登録されている関数のことです。
標準ライブラリ関数の一例
| 関数名 | Aさん |
| getchar | キーボードから1文字読み込む |
| scanf | キーボードから文字列を読み込む |
| strlen | 文字列の要素数を返す |
| strcpy | 文字配列に文字列をコピーする |
これらは非常に便利です。
例えばstrlen関数を自分で作成しようとすると手間ですが、標準ライブラリ関数とは既に用意されているものなので、strlenと書くだけで文字列の要素数を返してくれます。
上記は一例ですので、どのような標準ライブラリ関数があるのか確認してみて下さい。
練習問題
- キーボードで整数を2回入力します
- 2つの値を比べて大きい値を戻り値とする関数getMaxを作成しましょう
- プロトタイプ宣言をしてください
#include <stdio.h>
// 関数のプロトタイプ宣言
int getMax(int a, int b);
int main() {
int num1, num2;
// キーボードから整数を入力
printf("1つ目の整数を入力してください: ");
scanf("%d", &num1);
printf("2つ目の整数を入力してください: ");
scanf("%d", &num2);
// getMax関数を呼び出し、結果を表示
printf("大きい値は: %d\n", getMax(num1, num2));
return 0;
}
// getMax関数の本体
int getMax(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}出力結果

- キーボードで三角形の底辺と高さを入力します
- 三角形の面積を戻り値とする関数getAreaを作成しましょう
(面積を求める公式:底辺 * 高さ / 2) - プロトタイプ宣言をしてください
#include <stdio.h>
// 関数のプロトタイプ宣言
float getArea(float base, float height);
int main() {
float base, height;
// キーボードから底辺と高さを入力
printf("三角形の底辺を入力してください: ");
scanf("%f", &base);
printf("三角形の高さを入力してください: ");
scanf("%f", &height);
// getArea関数を呼び出し、結果を表示
printf("三角形の面積は: %.2f\n", getArea(base, height));
return 0;
}
// getArea関数の本体
float getArea(float base, float height) {
// 三角形の面積を計算して戻り値として返す
return (base * height) / 2.0;
}
出力結果


