1

私はstackoverflowを検索し、私の質問の単語のすべての組み合わせを見ましたが、私が持っている質問ではありません。

私はintの配列を持っています、それはたまたま2D配列です。

const int themap[something][something] = { {0, ...

プログラムにこの配列へのポインタが必要な構造体があります

typedef struct {
int** mymap;
} THE_STRUCT

私のプログラムでは、構造体のポインターを介して配列の値を反復処理したいのですが、を介してアクセスしようとすると、データが破損しているようです。構文

int value;
THE_STRUCT mystruct;
mystruct = (int**) themap;

...
//access the map data from mystruct's pointer?
value = mystruct.mymap[x][y];
//doesn't seem to return correct values

画像から構造体を取り出すと、配列を(グローバル変数として)直接使用した場合でも、まったく同じ関数が機能します。

int value;
...
//access the map directly
value = themap[x][y]
//everyone is happy!

構造体を使用したいのですが、実際には他の情報が含まれているだけでなく、異なるデータを持つ他の配列にポインターを割り当てることができる必要があるという事実もあります。

4

2 に答える 2

5

2次元配列はと同じではありませんint **。内にポインタを格納したい場合は、次のstructようにすることができます。

const int themap[something1][something2] = { {0, ...

typedef struct {
    const int (*mymap)[something2];
} THE_STRUCT;

...

THE_STRUCT my_struct;
my_struct.mymap = themap;

...

int value = my_struct.mymap[x][y];

を使用すること可能ですint **が、ある程度の努力が必要です。

const int themap[something1][something2] = { {0, ...
const int * themapPointerArray[something1] = {themap[0], themap[1], ..., themap[something1 - 1]};

typedef struct {
    const int **mymap;
} THE_STRUCT;

...

THE_STRUCT my_struct;
my_struct.mymap = themapPointerArray;

...

int value = my_struct.mymap[x][y];
于 2012-09-12T00:25:27.267 に答える
3

多次元配列int [][]と二重間接ポインタint **は、まったく異なる2つのものです。

多次元配列は、Cにとって、異なる方法でインデックス付けされた1次元配列です。言うxことですint [3][4]。次に、x12個の連続してパックされた要素が含まれx[1][2]、その1次元配列の6番目の要素にすぎません。

2次元配列として扱われる二重間接ポインターは、配列へのポインターの配列です。したがって、がの場合yint **y[1][2]「の2番目の要素が指す配列の3番目の要素」を意味しyます。

int [][]したがって、とは異なるものを表すだけなので、との間で変換することはできません( toをint **キャストすると、配列内の整数がポインタとして扱われ、必然的にクラッシュします)。int [][]int **int [][]

代わりに、-length配列の配列へのポインタint [M][N]としてキャストできます。int (*)[N]N

于 2012-09-12T00:26:38.217 に答える