array: int がありi[20][30]
ます。int**
その上で使用するポインターを作成する最速の方法は何ですか?
私の友人は、同じサイズの配列を使用する関数を作成したばかりで、私の関数はポインター上にあり、彼のデータを渡す必要があります。
array: int がありi[20][30]
ます。int**
その上で使用するポインターを作成する最速の方法は何ですか?
私の友人は、同じサイズの配列を使用する関数を作成したばかりで、私の関数はポインター上にあり、彼のデータを渡す必要があります。
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 **`...
手動でデータを調べてビルドする場合を除いて、に変更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;
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) を参照します。これは非常に迅速ですが、関数が元の次元を使用して配列を操作する必要がある場合、これは機能しません (ポインターの配列ではないため)。