第4回 解答例

配列・ポインタ・参照

演習の解答例。まず自分で書いてから読むこと。

1. 配列の最大値を求める

int findMax(const int values[], int count) {
    int max = values[0];

    for (int i = 1; i < count; i++) {
        if (values[i] > max) {
            max = values[i];
        }
    }

    return max;
}

void setup() {
    Serial.begin(115200);

    int values[5] = {12, 45, 7, 38, 21};

    Serial.println(findMax(values, 5));   // 45
}

void loop() {
}
  • 初期値は0ではなくvalues[0]にする。全要素が負の数でも正しく動く
  • ループはi = 1から始めてよい(values[0]は既に見ている)
  • 変更しない配列はconstを付けておくと意図が伝わる

2. ポインタを使って関数から変数を変更

void addOne(int* value) {
    *value = *value + 1;
}

void setup() {
    Serial.begin(115200);

    int count = 10;
    addOne(&count);

    Serial.println(count);   // 11
}

3. 参照を使って関数から変数を変更

void addOneRef(int& value) {
    value = value + 1;
}

void setup() {
    Serial.begin(115200);

    int count = 10;
    addOneRef(count);        // & は不要

    Serial.println(count);   // 11
}

値渡しとの違い

void addOneWrong(int value) {
    value = value + 1;   // コピーを書き換えているだけ
}

int count = 10;
addOneWrong(count);
// count は 10 のまま

引数はコピーが渡される。呼び出し元の変数を変えたいなら、ポインタか参照を使う。

書き方呼び出し側呼び出し元が変わるか
void f(int v)f(count)変わらない
void f(int* v)f(&count)変わる
void f(int& v)f(count)変わる

→ 第4回の本文に戻る