関数
前回、関数のプロトタイプ宣言に関して説明しました。
今回は関数に配列を渡す場合にどうするのかみてきましょう。
引数が配列と変数の時の違い
配列を引数として指定する場合、変数を指定する場合とは挙動が異なります。
以下のコードを見てみましょう。
変数を引数とする場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include void func( int num); int main( void ){ int num = 10; func(num); printf ( "num:%dn" , num); return (0); } void func( int num){ num *= 2; printf ( "func内 num:%dn" , num); } |
結果は以下のようになります。
1 2 | func内 num:20 num:10 |
配列の場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include void func( int array[]); int main( void ){ int i; int array[5] = {1, 2, 3, 4, 5}; func(array); for (i =0; i < 5; i++){ printf ( "array[%d]:%dn" , i, array[i]); } return (0); } void func( int array[]){ int i; for (i =0; i < 5; i++){ array[i] *= 2; printf ( "func内 array[%d]:%dn" , i, array[i]); } } |
結果
1 2 3 4 5 6 7 8 9 10 | func内 array[0]:2 func内 array[1]:4 func内 array[2]:6 func内 array[3]:8 func内 array[4]:10 array[0]:2 array[1]:4 array[2]:6 array[3]:8 array[4]:10 |
まず配列を引数として受け取る場合の形式を見てみましょう。
配列を引数として受け取る場合は、仮引数のところを配列形式にします。int array[]といった具合にします。
関数の実引数のところを見ると配列の識別名だけを指定しています。これは後にでてきますが、配列の先頭アドレスを
意味します。次に実際の処理を見てみましょう。
どちらのコードも関数内の処理は引数でもらった値を2倍して表示するようになっています。
また元となった値をfuncの後にメイン関数内でも表示させています。
引数として変数を使用している方のコードはメイン関数内の変数numは初期値が10となっています。
関数func内ではそれが2倍されて表示されていますが、その処理のあとメイン関数でnumを表示させても
numの値は元の10のままです。
一方、配列の方はメイン関数内の初期値として1,2,3,4,5が格納されています。
関数func内では変数の時同様に2倍されて表示されています。しかしその処理のあとメイン関数で元の配列array
を表示させると元の配列の値も2倍となっています。変数の時はメイン関数のnumには変化がなかったのに
配列の場合は元の値も関数内の処理が行われています。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載