第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) | 変わる |