配列の扱い
変数の場合は受け取った関数側に元の変数のコピーができます。つまりメイン関数内のnumとfunc内のnumはメモリ上の全く異なる部分に10という値が格納されていることになります。
しかし配列形式の場合は、受け取った関数側に配列のコピーができるわけではなく、元の配列の値が格納されている場所を呼び出した関数に教えているという動作となります。
そのため、実際は呼び出しもとと関数側で同じ配列を見ていることになります。
そのため関数内で配列内の値を2倍した場合、今回のようにmain関数側で表示させても値が2倍となったものとなります。
2次元配列の指定
2次元配列は先ほどの1次元配列とは少し異なります。
以下のコードを確認してください。
#include void func(int array[] [3]); int main(void){ int i, j; int array[2] [3] = {{1, 2, 3}, {10, 20, 30}}; func(array); for(i = 0; i < 2; i++){ for(j = 0; j < 3; j++){ printf("array[%d] [%d]:%dn", i, j, array[i] [j]); } } return(0); } void func(int array[] [3]){ int i, j; for(i = 0; i < 2; i++){ for(j = 0; j < 3; j++){ array[i][j] *= 2; printf("array[%d] [%d]:%dn", i, j, array[i] [j]); } } }
実行結果は以下のようになります。
array[0] [0]:2 array[0] [1]:4 array[0] [2]:6 array[1] [0]:20 array[1] [1]:40 array[1] [2]:60 array[0] [0]:2 array[0] [1]:4 array[0] [2]:6 array[1] [0]:20 array[1] [1]:40 array[1] [2]:60
今回の関数の処理も受け取った配列の要素を倍にしているだけとなります。
異なっているのは仮引数の指定方法で、1次配列の場合は要素数の指定は必要なかったのですが
2次元配列の場合、2つ目の要素数を指定する必要があります。
配列の1要素の中にいくつの要素の配列が入っているのか不明だとメモリ上の区切りがわからないため
2次元目の要素数を指定する必要があります。
このよう関数に配列を渡す際には変数を渡す場合と異なることがあるので注意してください。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載