C++ では “変数の集合” を扱う方法がいくつかある。最もシンプルなのが配列
double a[3]; // double 型の 3 成分配列
a[0] = 1; // C のインデックスは "0" から
a[1] = 2;
a[2] = 3;
double a[3] = {0,1,2}; // でも OK
double a[3][2]; // double 型の 3 * 2 行列
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;
a[2][0] = 5;
a[2][1] = 6;
double a[3][2] = {{1,2},{3,4},{5,6}} // でも OK
配列は宣言後に長さを変えられないし、長さに変数を用いることも (基本的には) できない
int i = 2;
double a[i] = {1,2}; // こういうことはできない
int i = 2;
double a[i];
a[0] = 1;
a[1] = 2; // これはコンパイラによってはできる
また配列をそのまま値渡しすることはできない。しかし実は配列はポインタと (ほぼ) 同じ概念である
void f(double *a);
int main() {
...
double a[2] = {1,2};
f(a);
...
}
double a[2] = {1,2};
cout << a << ' ' << a[0] << ' ' << a[1] << endl;
とすると
0x7ffeebe36630 1 2
多次元配列のポインタ渡しは以下のよう
void f(double a[][2]); // 2つ目以降のインデックスの長さは指定しなければならない
int main() {
...
double a[3][2] = {{1,2},{3,4},{5,6}};
f(a);
...
}
2つ目以降のインデックスの長さを指定しないとどこで “折り返す” かわからない
ちなみに参照渡しなら全ての長さを指定しなければならない
void f(double &a[3][2]);
int main() {
...
double a[3][2] = {{1,2},{3,4},{5,6}}:
f(a);
...
}