### 関数基本形
何らかの仕事をするのを「サブルーチン」、計算を「関数」と読んでいる言語もある
int foo(double a) // int型を返す関数, double aを引数という
double foo(double a) // double型を返す関数
void foo(double a) // データを返さない関数
関数から値を返す時はreturn文を使う
関数を呼び出す場合、関数の書式が先に判明している必要がある(関係書式だけ記述したものを関数プロトタイプという)
#include <stdio.h> double ave(double x, double y){ double wk; wk = (x + y) / 2.0; return wk; } int main(void){ double a, b, c; a = 11.11; b = 33.33; c = ave(a, b); printf("a=%f b=%f ave=%f\n", a, b, c); return 0; }
$ ./dev
a=11.110000 b=33.330000 ave=22.220000
数値を渡す場合は、Call by value(値呼び出し)という
配列を渡す場合は、アドレスによる呼び出し
void disp_ary(int n[]){ printf("n[0]=%d\n", n[0]); printf("n[4]=%d\n", n[4]); } int main(void){ int dt[5] = {10, 20, 30, 40, 50}; disp_ary(dt); return 0; }
$ ./dev
n[0]=10
n[4]=50
※配列名を指定すると、配列の先頭アドレスとして評価される
Cでは配列の長さはプログラマーが上手くやってくださいとなっている
### 文字列の引き渡し
最後の”\n”を利用することで長さを知ることができる
#include <stdio.h> void strout(char s[]){ int i; printf("s=%s\n", s); for(i=0; s[i] != '\0'; i++) printf("%X ", s[i]); printf("\n"); } int main(void){ char st[] = "ABCD"; strout(st); strout("abcde"); return 0; }
### ローカル変数とグローバル変数
グローバル変数はmain()の中の値でも使える
ローカル変数は衝突しない。グローバルよりローカルが優先される
#include <stdio.h> int g; void func(void){ int b; b = 99; printf("func b=%d g=%d\n", b, g); } int main(void){ int a; a = 10; g = 20; printf("func a=%d g=%d\n", a, g); func(); return 0; }
$ ./dev
func a=10 g=20
func b=99 g=20
staticの静的変数は値を保持する
#include
int g;
void func(int n){
int a = 0;
static int s = 0;
a = a + n;
s = s + n;
printf(“a=%d s=%d\n”, a, s);
}
int main(void){
int i;
for(i=1; i<=5; i++){
func(i);
}
return 0;
}
[/code]
$ ./dev
a=1 s=1
a=2 s=3
a=3 s=6
a=4 s=10
a=5 s=15