main関数とライブラリ関数
これまで扱ってきたプログラムは以下の形であった。
#include <stdio.h>
int main(void)
{
//略
return 0;
}
Cのプログラムには、main関数が1個だけ必要である。そして、main関数の中で、printf関数、scanf関数といった関数を利用してきた。これらの関数は、C言語によって標準で提供される。「ライブラリ関数(library function)」と呼ばれる。プログラムの先頭に、「#include <stdio.h>」と書いておくだけで利用できる。
関数とは
プログラミングで関数とは、「一連の処理の集まり」のこと。そして、関数(function)は自分でも作成できる。複雑な処理や何度も使う処理を関数としてまとめることで、何度も同じ処理を記述することなく、使いたいときに呼び出して実行できる。
ここでは、二つの数値のうち小さいほうの数値を求める関数をつくる。
関数の定義と呼び出し
関数の作り方=関数定義は、以下の通りである。(関数名:min2)
int min2(int a,int b)
{
if(a < b)
return a;
else
return b;
}
1行目のintは戻り値の型を宣言している。min2は関数名。次の()カッコ内は、仮引数型の並びである。次の行から{}内が関数本体である。実際に行う処理を書いていく。ここでは最小値(小さいほうの値)を求める。そして、求めたint型の値を呼び出し元に返却する。
次は、使い方=関数呼び出しである。先ほど作成した「min2」を定義して利用するプログラムを考える。
//二つの数値の小さい方を求めるプログラム
#include <stdio.h>
//小さい方の値を返す
int min2(int a,int b)
{
if(a < b)
return a;
else
return b;
}
int main(void)
{
int num1,num2;
printf("二つの整数を入力してください\n");
printf("整数1:"); scanf("%d",&num1);
printf("整数2:"); scanf("%d",&num2);
printf("小さいほうの値は%dです\n",min2(num1,num2));
return 0;
}
実行結果は以下の通り。
二つの整数を入力してください
整数1:45
整数2:83
小さいほうの値は45です
- 関数呼び出しがあると、プログラムの流れは呼び出された関数に移る。そして、呼び出し側が与えた実引数の値が、関数が受け取る仮引数に代入される。代入が終わると、関数本体の複合文が実行される。
- 関数内のreturn文は、関数の実行を終了させて、プログラムの流れを呼び出し元に戻すとともに値を返却する。結果、関数min2の返却値45がprintf関数に渡されて、その値が表示される。
引数の値の渡し方
実引数と仮引数
このように関数を使う際には、関数側と呼び出し元の両方で引数を指定する。そして、関数側を仮引数、呼び出し元を実引数という。
値渡しと参照渡し
引数の値の受け渡しは呼び出し元から関数側への一方通行である。値を呼び出し元に反映させるには戻り値を使う。このように、引数として値がやり取りされる仕組みを「値渡し」と呼ぶ。関数間の引数の受け渡しは値渡しである。仮引数は、実引数のコピーなので、関数本体で仮引数を変更しても実引数には影響しない。
なお、仮引数の値を変更して、呼び出し元に反映させるには、引数として、「アドレスを渡す」ことが考えられる。アドレスを渡すことで呼び出し元の値の場所を関数側でも参照できるようになる。このような引数の渡し方を「参照渡し」という。
変数のスコープ
変数には、宣言した場所によって有効範囲が異なる性質がある。これを「変数のスコープ」という。
ローカル変数とグローバル変数
ある関数の中で宣言された変数を「ローカル変数」といい、関数の外で宣言された変数を「グローバル変数」という。
ローカル変数とグローバル変数の仕組みを理解するためのプログラムを考える。
//ローカル変数とグローバル変数の仕組みを理解するためのプログラム
#include <stdio.h>
int y; //グローバル変数
int z; //グローバル変数
void func(int a)
{
int x,z;
x = a; //xはfunc関数のローカル変数
y = a; //yはグローバル変数
z = a; //zはfunc関数のローカル変数
}
int main(void)
{
int x; //このxはmain関数のローカル変数でfunc関数のxとは別モノ
x = 10;
y = 10; //yはグローバル変数
z = 10; //zはグローバル変数
puts("関数func呼び出し前");
printf("x = %d, y = %d, z = %d\n", x,y,z);
func(50);
puts("関数func呼び出し後");
printf("x = %d, y = %d, z = %d\n", x,y,z);
return 0;
}
実行結果は以下の通りである。
関数func呼び出し前
x = 10, y = 10, z = 10
関数func呼び出し後
x = 10, y = 50, z = 10
プログラムは、main関数から始まる。そしてx,y,zが10で初期化される。次にfunc関数が呼び出され、x,y,zに50が代入される。しかし、main関数に反映されるのはグローバル変数であるyのみである。
(参考文献)新・明解C言語 入門編 第2版 柴田望洋著(SBクリエイティブ)
基礎C言語 (株)アンク著(インプレス )
コメント