本文へスキップ
BecomeCoder

C言語コース · 第5章 配列と文字列 · レッスン20

配列を関数に渡す ― 大きさも一緒に渡す

ブラウザで完結

導入

配列関数に渡すと、要素をまとめて処理する部品が作れます。ただし 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]; から始め、forif (arr[i] > maxv) maxv = arr[i];、最後に return maxv;

実際に動かしてみよう

下のエディタにCを書いて「実行」を押すと、ブラウザ内のインタプリタで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(scanf を使う回は「標準入力」欄に値を入れてから実行します)。

C/C++ — ブラウザ内で実行

ブラウザ内でC/C++を動かす学習用インタプリタ(JSCPP)を読み込みます(入門向けのサブセットです)。
スクロールして表示された時点でも自動で読み込まれます。