C++ foreach的な書き方で書き換えるときは参照渡しを

#include<stdio.h>
#include<iostream>

using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)

void printArray(int *A, int n){
    FOR(i, 0, n){
        cout << A[i] << " ";
    }
    cout << endl;
}

int main(){
    int A[] = {1,2,3};
    printArray(A, 3);

    for(int v : A){
        v = 0;
    }
    printArray(A, 3);

    for(int& v : A){
        v = 0;
    }
    printArray(A, 3);

    return 0;
}
$ g++ experiment.cpp && ./a.out

1 2 3
1 2 3
0 0 0
  • for(auto a : A) この書き方
  • 参照渡しにするなら for(auto& a : A) こう書く。こう書かないと変更は反映されない
  • 逆に、書き換えないときは & を付けない方がいい