- 追加された行はこの色です。
- 削除された行はこの色です。
*プロトタイプ宣言 [#g0f406e5]
#freeze
*関数のプロトタイプ宣言 [#g0f406e5]
関数の''プロトタイプ宣言''は、関数の宣言です。
戻り値の型、関数名、引数の型、引数名を宣言します。
#geshi(c){{
戻り値の型 関数名(引数1の型 引数1の名前, 引数2の型 引数2の名前, ...);
}}
関数を使う前に、戻り値の型、関数名、引数の型、引数名を宣言しておかなければなりません。
関数を使う前に、プロトタイプ宣言が必要です。
#geshi(c){{
void inc(int i); // プロトタイプ宣言
int main(void) {
int i = 0;
inc(i); // 変数を渡す
printf("%d\n", i);
return 0;
}
/*
* 受け取った引数の値を1増やして出力する(関数定義)
*/
void inc(int i) {{
i++;
printf(">> %d\n", i)
}
}}
*プロトタイプ宣言を省略できる場合 [#n39604f6]
以下の二つの場合には、プロトタイプ宣言を省略することができます。
**関数定義 [#xbc88dda]
関数定義は、プロトタイプ宣言の代わりにできます。
関数定義はプロトタイプ宣言を兼ねています。
したがって、使用されるよりも前に関数が定義されている場合は、プロトタイプ宣言を省略できます。
これまでプロトタイプ宣言がなくても問題がなかったのは、このためです。
**関数の戻り値がint型 [#h5ceef01]
プロトタイプ宣言がないと、戻り値はint型であると仮定してコンパイルを進めます。
関数定義において戻り値がint型でないと、コンパイル時にエラーが発生します。
*ポインターによる参照渡し(おまけ) [#z4e2a0a3]
*プロトタイプ宣言における変数の有効範囲 [#g1b8651c]
C言語の参照渡しは、''ポインター型''の引数に、変数を記憶している領域の''アドレス''を渡すことによって行います。
関数のプロトタイプ宣言の引数として宣言した変数は、プロトタイプ宣言の中だけで有効です。
ポインターとアドレスについては、C言語応用で勉強する内容なので、ここでは詳しくは説明しません。
#geshi(c){{
/*
* 参照渡しで受け取った値を1増やす
*/
void inc(int *i) {
(*i)++;
printf(">> %d\n", i);
}
プロトタイプ宣言の引数の名前は、その関数の定義における引数の名前と同じである必要はありません。
引数名を省略することもできます。
ただし、引数の型は定義と同じでないといけません。
int main(void) {
int i = 0;
inc(&i); // 変数 i のアドレスを渡す
printf("%d\n", i);
return 0;
}
}}
#geshi(sh){{
luna% a.out
>> 1
1
}}
----
*まとめ [#d7dc0da7]
関数を使うには、事前に''プロトタイプ宣言''が必要です。
*課題・練習問題 [#z3bcf410]
**13C-1 [#x75c0e9b]
プロトタイプ宣言では、戻り値の型、関数名、引数の数とそれぞれの型を宣言します。
関数の定義は、プロトタイプ宣言の代わりになるので、関数が定義してある場合はプロトタイプ宣言を省略できます。
また、プロトタイプ宣言がない場合は戻り値がint型の関数と仮定されるため、戻り値がint型の関数はプロトタイプ宣言を省略できますが、省略せずにきちんと宣言しましょう。
----
*練習問題 [#z3bcf410]
練習問題は[[こちら>授業/C言語基礎/プロトタイプ宣言/練習問題]]。