23

メモリ内の領域へのポインタがあるという問題があります。このポインターを使用して整数配列を作成したいと思います。

基本的にこれは私が持っているもので、サイズが 100*300*2 = 60000 バイトのメモリ アドレスへのポインタです。

unsigned char *ptr = 0x00000000; // fictional point in memory goes up to 0x0000EA60

私が達成したいのは、次のように、このメモリをサイズ 100*150 = 15000 ints = 60000 バイトの整数配列として調べることです。

unsigned int array[ 100 ][ 150 ];

私はそれを定式化する方法が正確にはわかりませんが、いくつかのキャスティングが含まれていると想定しています。どんな助けでも大歓迎です。

4

2 に答える 2

22

へのポインタをキャストできますunsigned int (*)[150]その後、2D 配列であるかのように使用できます(「のように」、動作sizeofが異なるため)。

unsigned int (*array)[150] = (unsigned int (*)[150]) ptr;
于 2012-07-12T14:45:25.153 に答える
1

ptr 宣言から始めます

unsigned char *ptr = 0x00000000; // fictional point in memory goes up to 0x0000EA60

ブロックを処理している任意の型へのポインターに ptr をキャストできます。この場合は、unsigned int の配列の配列です。新しいポインターを宣言します。

unsigned int (*array_2d)[100][150] = (unsigned int (*)[100][150])ptr;

次に、通常の 2 次元配列の場合と同じように、逆参照してからインデックスを作成して要素にアクセスします。

(*array_2d)[50][73] = 27;

一部typedefの s は、物事をクリーンアップするのにも役立ちます。

typedef unsigned int my_2d_array_t[100][150];
typedef my_2d_array_t *my_2d_array_ptr_t;
my_2d_array_ptr_t array_2d = (my_2d_array_ptr_t)ptr;
(*array_2d)[26][3] = 357;
...

そして、sizeof適切に動作するはずです。

sizeof(array_2d); //4, given 32-bit pointer
sizeof(*array_2d); //60000, given 32-bit ints
sizeof((*array_2d)[0]); //600, size of array of 150 ints
sizeof((*array_2d)[0][1]); //4, size of 1 int
于 2017-11-02T19:09:26.530 に答える