1

私は配列を持っていますint b[MAXN][MAXN];

使用するとint a[][MAXN] = b;(問題ないことはわかっていint (*a)[MAXN]ます)、エラーが発生します。

しかし、私が関数を持っていれば、void f(int a[][MAXN]) 呼び出すf(b); とうまくいきます!

誰かが理由を教えてくれますか?

4

2 に答える 2

1

関数パラメータを宣言する場合、T[]は と同じようT*に扱われます。つまり、パラメータをポインタとして宣言します。そのvoid f(int a[][MAXN])ため、パラメータをsize の配列aへのポインタとして 宣言するだけです。intMAXN

ただし、他の種類の変数の場合は同じではありません。それはあなたが書くときです、これは配列へのポインタではなく、配列または配列としてint a[][MAXN] = b宣言します。aそして、それが機能しない理由です(配列をそのような他の配列に「ポイント」させることができないため)。

これは配列の配列に固有のものではないことに注意してください。と比べvoid f(int a[])ても同じですint a[] = b。前者の場合、パラメーターaは単純にintポインターになり (記述した場合とint *a同様)、後者の場合aは配列になり、上記と同じ理由でエラーが発生します。

于 2013-05-13T13:40:09.817 に答える
0

次のように、[宣言で]配列変数を別の配列変数で初期化することはできません。

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);
于 2013-05-13T13:39:31.713 に答える