私は配列を持っていますint b[MAXN][MAXN];
使用するとint a[][MAXN] = b;
(問題ないことはわかっていint (*a)[MAXN]
ます)、エラーが発生します。
しかし、私が関数を持っていれば、void f(int a[][MAXN])
呼び出すf(b);
とうまくいきます!
誰かが理由を教えてくれますか?
私は配列を持っていますint b[MAXN][MAXN];
使用するとint a[][MAXN] = b;
(問題ないことはわかっていint (*a)[MAXN]
ます)、エラーが発生します。
しかし、私が関数を持っていれば、void f(int a[][MAXN])
呼び出すf(b);
とうまくいきます!
誰かが理由を教えてくれますか?
関数パラメータを宣言する場合、T[]
は と同じようT*
に扱われます。つまり、パラメータをポインタとして宣言します。そのvoid f(int a[][MAXN])
ため、パラメータをsize の配列a
へのポインタとして 宣言するだけです。int
MAXN
ただし、他の種類の変数の場合は同じではありません。それはあなたが書くときです、これは配列へのポインタではなく、配列または配列としてint a[][MAXN] = b
宣言します。a
そして、それが機能しない理由です(配列をそのような他の配列に「ポイント」させることができないため)。
これは配列の配列に固有のものではないことに注意してください。と比べvoid f(int a[])
ても同じですint a[] = b
。前者の場合、パラメーターa
は単純にint
ポインターになり (記述した場合とint *a
同様)、後者の場合a
は配列になり、上記と同じ理由でエラーが発生します。
次のように、[宣言で]配列変数を別の配列変数で初期化することはできません。
int a[1] = {};
int b[] = a;
それは、ポインターの状況に衰退することではありません。最初の配列のコピーである新しい配列を宣言したいようです。示したように配列を関数パラメーターとして渡すと、それらはポインターに減衰し、新しい配列を作成することはありません。
代わりに、参照が必要な場合は、次のようにすることができます。
int a[1] = {};
int (&b)[1] = a; // first reference
auto &c = a; // second rerefence
コピーを作成する場合は、コピーを作成します。
int a[1] = { 42 };
int b[1];
decltype(a) c;
std::copy(std::begin(a), std::end(a), b);
std::copy(std::begin(a), std::end(a), c);