関数に渡す値、引数

関数を呼び出すとき、ある値を関数に渡したくなる時があります。
関数には、値を渡す機能があり、その渡す値のことを「引数」と言います。
まずは、改めて関数の書き方を見てみましょう。

戻り値の型 関数名( 引数1, 引数2 )
{
}

引数はいくつでも渡すことができます。
引数を渡すときは、char や int など、引数の型をあらかじめ決めておかないといけません。
そして、関数を呼び出しするときも、その型にあった引数を渡す必要があります。

スポンサーリンク

サンプルプログラム

ソースファイル名:main.c

実行方法

上のソースを書き写して実行してください。
引数の違いによる printf の出力の違いに注意してください。

関数はどんな時に使うの?

C言語を使っていると様々な場面で関数を使います。
お気づきかもしれませんが、いままで使っていた printf() や getchar() も関数です。
さて、この関数はどういう場合に使うのでしょうか?

ひとつは、長いプログラムを書く時、一つの関数が冗長になるのを防ぐために使います。
例えば、main 内に全てのソースを書くとプログラムが長くなった時に特定の処理を見つけるのが大変になりますよね。
そういうときは、関数を使って細かく処理をわけることが可能です。

もう一つは、特定の処理に特化したプログラムを作るときに活躍します。
関数は、英語で function、つまり機能です。
その名前が表す通り、本来の使い方としてはこちらになります。

今回の例では sub という名前の関数を作りました。
名前に関しては任意で構いません。
ただ一つ、ルールとして、関数は呼び出す側の関数(今回だと main )よりも上に書く必要があります。

試しに下に書いて実行しようとしてみてください。
"そんな関数知りません"という意味のエラーが出ます。
実際には、下に書く方法もあるのですが、それは別のページで紹介します。

引数とは?

さて、今回は引数についてなのですが、これは、関数を呼ぶときにもって行く任意の値のことをいいます。
ちなみに、読み方は「ひきすう」です。
「いんすう」ではありませんので注意してください・・・
引数の渡し方なのですが、サンプルプログラムの

sub( 10 );

のように、直接定数を指定する事もできるし、

sub( a );

のように変数で渡す事もできます。

引数を使うときの注意点

型は合わせる必要がある

C言語の関数では、基本的に型が違うものを渡す事は基本的には許されていません。
(※対処法もありますが、この法則に従うべきです)
引数の型は、呼ぶ側、呼び出される側で合わせる必要があります。

サンプルプログラムでは、呼び出される側は、

void sub( int arg1 )

となっており、引数は赤字の int arg1 の部分です。
これは、

"sub 関数は、int 型の引数を arg1 という名前で使います"

という意味になります。 呼び出す側は、

sub( 10 );
sub( a );

で sub を読んでいますが、10 や a の値が、sub 関数へ行くとarg1 に入ることになります。

ここで、定数はどんな型なのかという疑問がわきますが、定数は基本的にどんな型にもなり得ます。 ただ、「変数」の項目で書いているのですが、各変数には上限値があり、それを超える値は入れれないので注意して下さい。

今回のサンプルプログラムで言えば、10 は整数なので、sub の引数の型である int で問題なく扱えます。 変数 a も int 型で宣言しているので問題ありません。
試しに、a の変数宣言の部分を

float a;

としてください。
float は少数を扱う型なので、引数の型が違いますという警告が出ると思います。

数は同じにする必要がある

引数の数は、呼ぶ側、呼び出される側で同じにする必要があります。
サンプルプログラムでは、呼び出される側は、

void sub( int arg1 )

となっており、引数は一つです。
ですから、呼び出す側も

sub( 10 );

というように、引数を一つ入れて呼び出します。

複数の引数を渡すときは、カンマで区切る

引数は複数持つ事もできます。
サンプルプログラムの sub 関数の引数を二つにするなら

void sub( int arg1, int arg2 )
{
  ....
}

というように、引数と引数の間をカンマで区切って列挙していきます。
複数の引数を持つ関数を呼び出すときは

sub( 10, 0 );

という具合でカンマで区切って入れる引数を列挙していきます。
この場合だと、arg1 には 10 が、arg2 には 0 が入ることになります。

複数が無いときは()だけを付ける

引数が無い関数を呼び出すときは、

sub();

という具合に、()で括れば大丈夫です。
よくサンプルプログラムで出てくる getchar は引数が無い関数の呼び出しになっています。

スポンサーリンク