=== 8. 関数 ==========================

プログラマは複雑で困難な情報処理を、単純で容易な情報処理に分割してプログラムを構築していく。分割した処理は関数という単位に分けられる。関数とは、あるまとまった処理を行う文の集まりで、引数というinputと戻り値というoutputを持つ。関数という形にまとまった処理には関数名という名前がつけられ、他の関数から呼び出されて利用する。

関数の呼び出し

C言語の関数は0個以上の引数をもち、0個あるいは1個の戻り値を持ちます。呼び出された関数は、その関数の定義の終端にたどり着くか、return文を実行した時点で終了し、呼び出し元の関数へ帰っていく。
関数を定義するときの引数を仮引数といい、関数が呼び出すときの引数を実引数という。

値渡し

C言語の関数は、すべて値渡しを行う。すなわち、引数は全て呼び出し側で評価され、その値のみが関数へ渡されます。関数の側で引数の値をいくら変更しても呼び出し元に影響を与えることはありません。

stateful function(自己記憶関数, 状態保持関数)

関数内で定義されている変数のうち、自動変数は、その関数が終了すると解放される。しかし、静的な変数(staticな変数)は関数が終了しても値を保持し続けます。static付きの変数を関数内で定義することで、「記憶を持った関数(remaining function)」を定義することができます。

int get_counter(void)
{
	static int counter = 0;

	return(counter++);
}

この関数get_counterは呼び出されるごとに、0, 1, 2, ...を順に返します。この関数は自分が今までに何回呼び出されたかを覚えているみたいになる。

再帰関数

C言語では、関数を再帰的に呼び出すことができる。すなわち、関数は自分自身を呼び出せる。関数定義の中で自分自身を呼び出しても構わないし、関数が相互に呼び合って(相互再帰)も構わない。

main関数

C言語ではプログラムが起動すると、main関数が一番最初に呼び出される。従って、プログラムの中には、たった1つだけmain関数が定義される必要がある。その関数がプログラムの入り口となる。main関数からreturnすると、プログラム全体が終了することになる。
main関数の宣言
主なmain関数の宣言は次の2つ。

int main(void);
int main(int argc, char* argv[]);

関数mainは、引数を全く取らないか、2つの引数argc, argvをとる。戻り値はいずれもint。プログラムが起動するときにOSから引数を受け取る。これをコマンドライン引数という。

$> ./a.out abc 123

※コンパイラによっては、main関数が3番目の引数をもっているものもある。それは、char *envp[]で環境変数を表す。