7.関数7.1.関数の作成C言語では自分で関数を作成することもできます。自分で関数を作成する場合も、以下の関数の形式に従います。 返り値の型 関数名(引数の型 引数名,...){
+----------------------------------+
| |
| 関数内部の処理 |
| |
+----------------------------------+
}
以下のサンプルは1から10まで、それぞれの3乗値を計算して出力するプログラムです。 1: #include <stdio.h>
2:
3: int power_3(int value){
4: return(value*value*value);
5: }
6:
7: int main(int argc,char *argv[]){
8: int i,value;
9: for(i=1;i<=10;i++){
10: value=power_3(i);
11: printf("%d^3=%d\n",i,value);
12: }
13: return(0);
14:}
3〜5行目で引数で与えられた数の3乗を返す関数を定義し、10行目でその関数を呼び出しています。自作の関数を呼び出す場合は、それまでに定義されているか、プロトタイプ宣言されている必要があります。プロトタイプ宣言とは、先に関数の引数の型および返り値の型だけを明らかにしておき、中身の実装を後回しにすることです。例えば上のサンプルでは以下のようになります。(3行目以下のみ) 3: int power_3(int);
4:
5: int main(int argc,char *argv[]){
6: int i;
7: for(i=1;i<=10;i++){
8: printf("%d^3=%d\n",i,power_3(i));
9: }
10: return(0);
11:}
12:
13:int power_3(int value){
14: return(value*value*value);
15:}
(実習課題)以下のプログラムを作成しなさい。
7.2.関数とポインタ関数は引数として、ポインタを取ることもできます。しかしポインタを使う場合は、挙動が少し異なるので注意が必要です。 1: #include <stdio.h>
2:
3: void inc(int a){
4: a++;
5: printf("inc:a=%d\n",a);
6: }
7:
8: int main(void){
9: int a=10;
10: inc(a);
11: printf("main:a=%d\n",a);
12: return(0);
13:}
例えば上のサンプルプログラムを実行すると、「inc:a=11」「main:a=10」と表示されます。inc関数の中でのaの増加が、呼び出し元のmain関数のaには反映されていません。これは関数に引数として変数の値が渡される際、関数内部にまったく別のデータ領域をもった変数が新しく作成され、それに引数のデータがコピーされるためです。したがって関数内での処理の影響を、元の変数は受けません。上のサンプルでは、main関数の変数aはinc内での処理に影響されません。 1: #include <stdio.h>
2:
3: void inc(int* a){
4: (*a)++;
5: printf("inc:a=%d\n",*a);
6: }
7:
8: int main(void){
9: int a=10;
10: inc(&a);
11: printf("main:a=%d\n",a);
12: return(0);
13:}
しかしポインタを使用した上のサンプルを実行すると、「inc:a=11」「main:a=11」と同じ値が表示されます。これは関数に変数を渡す際に、変数の値ではなく、データ領域のアドレスがコピーされるためです。incの中でポインタaは、main関数の変数aのデータ領域アドレスを指し示しているので、実質どちらも同じデータ領域を保持していることになります。したがってポインタが指し示す値を増加させると、main関数内の変数aの値も増加することになります。この方法は「gets」関数でも使用されています。getsは引数としてchar型のポインタをとり、このポインタが指し示すデータ領域に標準入力から読み込んだ文字列を格納しています。 ![]() ポインタによるデータの引き渡しは、関数から2つ以上の処理の結果を取り出したい時に使用できるので、非常に便利です。 (実習課題)以下のプログラムを作成しなさい。
7.3.再帰呼び出し「再帰呼び出し」とは、自分自身が自分自身の関数を呼び出すことです。main以外の自作の関数は再帰呼び出しを実現することができます。以下は1から100までの足し算を再帰呼び出しを利用して実行するサンプルプログラムです。 1: #include <stdio.h>
2:
3: int sum(int value){
4: if(value==0){
5: return(0);
6: }else{
7: return(value+sum(value-1));
8: }
9: }
10:
11:int main(void){
12: printf("sum=%d\n",add(100));
13: return(0);
14:}
関数「sum」は与えられた引数までの合計を返す関数です。valueまでの合計とは、value-1までの合計にvalueを加えたものですので、その部分に再帰呼び出しを使用しています(7行目)。再帰呼び出しは鏡の前に鏡を置いた状態と同じで、単純に使用すると「鏡の中に鏡が写り、その鏡の中に鏡が写り...」というような無限ループに陥ってしまいます。したがって必ず再帰呼び出しを行わない条件を、関数に埋め込まなければなりません。サンプルでは4行目にその条件が記されています。 (実習課題)以下のプログラムを作成しなさい。
|
![]()
![]()
|