5

多次元配列の標準的な方法を作成する方法を知っています:

const int m = 12;
const int y = 3;
int sales[y][n];

そして、1 つの次元配列を指すポインターを作成する方法を知っています。

int * ms = new int[m];

しかし、多次元配列を指すポインターを作成することは可能ですか?

int * sales = new int[y][m];   // doesn't work
int * mSales = new int[m];    // ok
int * ySales = new int[y];    // ok
mSales * ySales = new mSales[y];    // doesn't work, mSales is not a type

そのようなポインタを作成する方法は?

4

3 に答える 3

8

new int[m][n]は を作成しarray[m] of array[n] of intます。これは配列 new であるため、戻り値の型は最初の要素へのポインターに変換されます: pointer to array[n] of int. あなたが使用しなければならないものはどれですか:

int (*sales)[n] = new int[m][n];

もちろん、配列 new はまったく使用しないでください。ここでの _best_solution は、メモリMatrixを使用して単純なクラス を作成することです。std::vector問題に対するあなたの気持ちに応じて、オーバーロードし てインデックス作成にoperator()( int i, int j )使用するか、オーバーロードして 2 番目のインデックス作成を行うことを定義するヘルパーを返すことができます。(ヒント: で定義されています。境界チェックなどに煩わされたくない場合は、プロキシとしてジョブを実行します。)(i, j)operator[]( int i )operator[]operator[]int*int*

または、次のようなもの:

std::vector<std::vector<int> > sales( m, n );

仕事はしますが、長期的には、Matrixクラスはそれだけの価値があります。

于 2012-08-07T13:34:25.603 に答える
5

もちろん、それは可能です。

int へのポインターへのポインターを作成します。構文は次のようになります。

int** ptr = sales;

おそらく、人々が文字列の配列を渡すとき (main() の argv で行うように) は、常に文字の配列の配列を渡しているため、この例は思ったよりも多く見たことがあるでしょう。

もちろん、可能な場合は std::string を使用することをお勧めします:)

于 2012-08-07T13:13:00.620 に答える
3

私はそれがこのようなものだったことを覚えています:

int** array = new int*[m];
for(int i=0; i<m; i++) {
    array[i] = new int[n];
}
于 2012-08-07T13:14:12.720 に答える