「C言語/関数」の版間の差分

削除された内容 追加された内容
関数の簡単な例のコードを、冒頭に移動。
編集の要約なし
108 行
 
 
== 引数と返却値 ==
=== 引数と返却値をもたない関数 ===
<source lang=c>
//例 引数と返却値をもたない関数
#include <stdio.h>
 
void HelloWorld()
{
printf("Hello, World!\n");
}
 
int main(void)
{
HelloWorld();
}
</source>
この例では自作のHelloWorld関数を使って文字列を表示している。
このHelloWorld関数は引数と返却値をもたない関数である。
このプログラムでは、
まずmain関数が呼ばれ、
次にmain関数内のHelloWorld関数を呼ぶ文が実行されることでHelloWorld関数が呼ばれ、
HelloWorld関数内のprintf関数を呼ぶ文が実行されることでprintf関数が呼ばれる。
そしてprintf関数が終了してHelloWorld関数に戻り、
HelloWorld関数が終了してmain関数に戻り、
main関数が終了してプログラムが終了する。
 
この例では関数を自作したメリットはないが、
同じ処理がソースコードのあちこちに出てくる場合などは、
その同じ処理を自作の関数にまとめるとメリットがある。
 
=== 引数と返却値をもつ関数 ===
<source lang=c>
//例 引数と返却値をもつ関数
#include <stdio.h>
 
double calc(double radius)//「calc関数の定義」
{
return 3.14*radius*radius;
}
 
int main(void)
{
double radius, area;
printf("円の半径を入力してください。:");
scanf("%lf", &radius);
area=calc(radius);//「calc関数の呼び出し」
printf("円の面積は%fです。\n",area);
}
</source>
この例では、自作のcalc関数を用いて、円の半径から円の面積を計算している。
このcalc関数は引数と返却値をもつ関数である。
「calc関数の呼び出し」のところのradiusを実引数と呼ぶ。
「calc関数の定義」のところのradiusを仮引数と呼ぶ。
このプログラムでは、
「calc関数の呼び出し」で、まずmain関数のradiusが実引数としてcalc関数に渡され、
その値がcalc関数の仮引数のradiusにコピーされ、
それから、計算結果が返却値として返され、
その値が変数areaに代入されている。
 
 
=== 関数に複数の返却値を持たせる方法 ===
関数による通常の返却値の方法では、1つの値しか、呼び出し元関数に値を送れない
 
しかし、特殊な方法を使うことにより、呼び出しもとの関数に、複数の値を送ることができる。
 
下記に述べるように、少なくとも以下の3つの方法がある。
 
=== コラム ===
{{コラム|局所変数とアドレス操作の関係|
* 局所変数の実現方法
498 ⟶ 566行目:
<ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref>
 
 
== 引数と返却値 ==
=== 引数と返却値をもたない関数 ===
<source lang=c>
//例 引数と返却値をもたない関数
#include <stdio.h>
 
void HelloWorld()
{
printf("Hello, World!\n");
}
 
int main(void)
{
HelloWorld();
}
</source>
この例では自作のHelloWorld関数を使って文字列を表示している。
このHelloWorld関数は引数と返却値をもたない関数である。
このプログラムでは、
まずmain関数が呼ばれ、
次にmain関数内のHelloWorld関数を呼ぶ文が実行されることでHelloWorld関数が呼ばれ、
HelloWorld関数内のprintf関数を呼ぶ文が実行されることでprintf関数が呼ばれる。
そしてprintf関数が終了してHelloWorld関数に戻り、
HelloWorld関数が終了してmain関数に戻り、
main関数が終了してプログラムが終了する。
 
この例では関数を自作したメリットはないが、
同じ処理がソースコードのあちこちに出てくる場合などは、
その同じ処理を自作の関数にまとめるとメリットがある。
 
=== 引数と返却値をもつ関数 ===
<source lang=c>
//例 引数と返却値をもつ関数
#include <stdio.h>
 
double calc(double radius)//「calc関数の定義」
{
return 3.14*radius*radius;
}
 
int main(void)
{
double radius, area;
printf("円の半径を入力してください。:");
scanf("%lf", &radius);
area=calc(radius);//「calc関数の呼び出し」
printf("円の面積は%fです。\n",area);
}
</source>
この例では、自作のcalc関数を用いて、円の半径から円の面積を計算している。
このcalc関数は引数と返却値をもつ関数である。
「calc関数の呼び出し」のところのradiusを実引数と呼ぶ。
「calc関数の定義」のところのradiusを仮引数と呼ぶ。
このプログラムでは、
「calc関数の呼び出し」で、まずmain関数のradiusが実引数としてcalc関数に渡され、
その値がcalc関数の仮引数のradiusにコピーされ、
それから、計算結果が返却値として返され、
その値が変数areaに代入されている。
 
 
=== 関数に複数の返却値を持たせる方法 ===
関数による通常の返却値の方法では、1つの値しか、呼び出し元関数に値を送れない
 
しかし、特殊な方法を使うことにより、呼び出しもとの関数に、複数の値を送ることができる。
 
下記に述べるように、少なくとも以下の3つの方法がある。