1

私はC++の初心者です。学びながら、私はこれに出くわしました。

このようなポインタがあれば

int (*a)[2][3]

cdecl.orgはこれを次のように説明していますdeclare a as pointer to array 2 of array 3 of int:

やってみると

int x[2][3];

a = &x;

これは機能します。

a私の質問は、new()で使用するときにどのように初期化できるかです。

a = new int [] [];

いくつかの組み合わせを試しましたが、うまくいきません。

どんな助けでもありがたいです。

4

2 に答える 2

5

これは 2 つの手順で行う必要があります。最初にポインターの配列をポインター (動的に割り当てられた配列) に割り当ててから、それぞれを順番に割り当てます。全体として、より良いオプションは単に使用することだと思います-これは、この種のことを行うstd::vectorための好ましい方法です。C++

まだここにあなたが望むものを達成する方法の例があります:

int a**;
a = new int*[2];
for (int i =0; i< 2;++i){
  a[i] = new int[3]
}

... use them ...
// Don't forget to free the memory!
for (int i = 0; i< 2; ++i) {
  delete [] a[i];
}

delete [] a;

編集:およびデフォルトで要求されたとおり-ベクターバージョン:

std::vector<std::vector<int> > a(2, std::vector<int>(3,0));

// Use a and C++ will take care to free the memory.
于 2013-01-16T11:16:46.773 に答える
3

それはおそらくあなたが探している答えではありませんが、必要なのは戻り値の型が次の新しい式(*)[2][3] です。たとえば、これは の戻り値の型ですnew int [n][2][3]。これをa行うと、[3] int の配列の [2] の配列の最初の要素がポイントされます。要するに、3 次元配列です。

問題はnew、最上位の配列型へのポインターを返さないことです。配列の最初の要素へのポインターを返します。そのnew int[2][3]ため、式 は 3 int の 2 配列の配列を割り当てますが、3 int の配列 ( int (*a)[3]) へのポインターを返します。これは、C++ では配列が壊れているためです (C との互換性のため)。そして、それ以外のことを強制する方法はありません。したがって、2 次元配列へのポインターを返すようにするには、3 次元配列を割り当てる必要があります。(最初の次元は 1 になる可能性があるためnew [1][2][3]、トリックを実行し、効果的に単一の のみを割り当て[2][3]ます。)

より良い解決策は、配列を次のようにラップすることstructです。

struct Array
{
    int data[2][3];
};

その後、 を使用できnew Array、すべてが期待どおりに機能します。ただし、配列へのアクセスに必要な構文は異なります。

于 2013-01-16T11:32:49.143 に答える