2

array: int がありi[20][30]ます。int**その上で使用するポインターを作成する最速の方法は何ですか?

私の友人は、同じサイズの配列を使用する関数を作成したばかりで、私の関数はポインター上にあり、彼のデータを渡す必要があります。

4

3 に答える 3

2
int a[20][30];       // data as 2D array
int *ap[20];         // array of pointers
for (j = 0; j < 20; ++j)
    ap[j] = a[j];    // convert array to pointers
// can now pass `ap` to function expecting `int **`...
于 2013-03-12T13:39:59.040 に答える
0

手動でデータを調べてビルドする場合を除いて、に変更int i[20][30]することはできません。 しかし、あなたを助けるかもしれない何か、c ++のすべてのxD配列は、メンバーにアクセスするための何らかの複雑な方法を備えた単なる1D配列です。int **

例:

#define MaxX 20
#define MaxY 30
int i[MaxX][MaxY];
...
//When you write:
i[x][y] = something;
//It's actually been translate to:
i[x * MaxY + y] = something;
于 2013-03-12T13:57:12.117 に答える
0

int **その配列へのポインターを直接持つことはできません。意味がありません。配列にメモリのブロックとしてアクセスしたい場合は、次を使用できます。

int *p = (int *)i; // you can go to up (p + 20*30)

それ以外の場合は、の配列へのポインターが必要ですint[30]。つまり、

int (*p)[30] = &i[0]; // points to first row

最初のものでは、キャストのために、次を定義できます。

int **p2 = &p;

で配列にアクセスできます*(*p2 + n)。配列の次元をキャストしましたが、ポインター計算でそれらを使用する限り、すべて有効です。つまり*(*p2 + 35)、行 2、列 6 (30 の 1 つの行と次の要素 5) を参照します。これは非常に迅速ですが、関数が元の次元を使用して配列を操作する必要がある場合、これは機能しません (ポインターの配列ではないため)。

于 2013-03-12T13:47:04.273 に答える