導入
配列を関数に渡すと、要素をまとめて処理する部品が作れます。ただし C では、渡された側で「配列の長さ」が分からなくなるという落とし穴があります。
説明
引数は 型 名前[] と書きます。C では配列を渡すと先頭の位置だけが渡り、要素数の情報は消えてしまいます。そのため、長さは別の引数(下の n)で一緒に渡すのが定番です。
#include <stdio.h>
int sum(int arr[], int n) {
int total = 0;
for (int i = 0; i < n; i++) {
total += arr[i];
}
return total;
}
int main(void) {
int nums[5] = {10, 20, 30, 40, 50};
printf("%d\n", sum(nums, 5)); // 150
return 0;
}
もう1つ大事な性質があります。関数の中で配列の要素を書き換えると、呼び出し元の配列も変わります(コピーではなく、同じ場所を指しているため)。
#include <stdio.h>
void double_all(int arr[], int n) {
for (int i = 0; i < n; i++) {
arr[i] *= 2; // 元の配列を直接書き換える
}
}
int main(void) {
int nums[3] = {1, 2, 3};
double_all(nums, 3);
for (int i = 0; i < 3; i++) {
printf("%d ", nums[i]); // 2 4 6
}
printf("\n");
return 0;
}
この「同じ場所を指す」仕組みは、次の章のポインタにつながる大切な考え方です。
やってみよう
sum に渡す配列や n を変えて結果を確かめましょう。double_all を2回呼ぶと値がどうなるかも見てください。
演習
int arr[] と長さ int n を受け取り、要素の最大値を返す関数 max_of を定義し、int data[4] = {4, 9, 2, 7}; を渡して結果を表示してください(結果は 9)。
ヒント1を見る
int maxv = arr[0]; から始め、for で if (arr[i] > maxv) maxv = arr[i];、最後に return maxv;。