C言語の関数

### 関数基本形
何らかの仕事をするのを「サブルーチン」、計算を「関数」と読んでいる言語もある
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