2009-08-20 10 views
2

CreateFileMapping関数は、メモリマップファイルへのポインタを返します。そのメモリマッピングを配列として扱いたいと思います。ここでC++の配列へのポインタへの変換

は、私は基本的に何をしたいです:

char Array[] = (char*) CreateFileMapping(...); 

どうやら私は単に私の腕を振ると、ポインタが現在配列であることを宣言することはできませんを除き。

どうすればいいですか?私は大きなファイルであまりにも多くのメモリを使用するので、ポインターが指している値を配列にコピーしたくない。

おかげで、

答えて

22

あなたは必要ありません。ポインタを配列のようにインデックスすることができます。

char* p = (char*)CreateFileMapping(...); 
p[123] = 'x'; 
... 
+0

恐ろしく、ありがとう! –

+0

配列とポインタでsizeof()を呼び出すと、異なる値が返されることに注意してください。ポインタは、配列ではなくポインタのサイズを返します。つまり、配列の長さのトリックを行う代わりに、配列のサイズに沿って送る必要があります。 char(* p)[] = ... 'を実行することで真のポインターを作成し、'(* p)[123] = 'x';を使ってメンバーを得ることができますまだそれを渡すことなくサイズを取得します。 –

1

しかし、どのようにポインタが配列と異なっていますか?

char *Array = (char*)CreateFileMapping(...);

と間違っている何あなたはArray多かれ少なかれ、あなたが今から配列を扱うのと同じように扱うことができます。

+0

違いがあります。配列はsizeof()を呼び出すことができますが、ポインタは配列ではなくポインタのサイズを返します。したがって、メモリ内のターゲットデータチャンクの長さは、配列へのポインタから取り出すことはできません。残念なことに、配列のサイズを指定しないと、配列へのポインタを実際の配列に変換する方法はありませんが、それ以上は変換する必要はありません。 –

+0

@ user1884803、ええ、問題は違いはありません配列とポインタの間には、このコンテキストの違いは何でしょうか。 –

5

C/C++では、ポインタと配列は同じものではありません。

しかし、あなたの場合は、あなたの目的のためです。

あなたにはポインタがあります。

添え字を付けることができます。

など。

ポインタ「ハロー」の先頭へ*ポインタはcharが[0]の最初の文字「H」

ポインタである[1]番目の文字「E」

あるので、それを扱いますあなたが配列について考えているように。

+2

言語には、ポインタと配列は同じものです。配列は、一連の最初のオブジェクトへのポインタです。 – user142350

+4

@ dnh828、あなたは間違っています。配列と "同じ"タイプのポインタに 'sizeof'を使ってみてください。 1つのアレイを別のアレイに割り当てることもできます。配列へのポインタは、ポインタへのポインタとは区別されます。等々。 –

+8

より具体的には、C/C++では、_decay_から特定のコンテキストのポインタ_に配列されます。常にではない。 –

1

あなたがCスタイルのキャストを使用することができます

char *p = (char*)CreateFileMapping(...); 
p[123] = 'x'; 

又は好ましい再解釈キャスト:

char *p std::reinterpret_cast<char*>(CreateFileMapping(...)); 
p[123] = 'x'; 
2

"C/C++でのポインタと配列が同じものではありません。"は真ですが、配列の変数名はポインタconstと同じです(これは私の古いCoriolis C++ Black Bookのものです)。これは役に立ちます:

char carray[5]; 
char caarray2[5]; 
char* const cpc = carray; //can change contents pointed to, but not where it points 

/* 
    cpc = carray2; //NO!! compile error 
    carray = carray2; //NO!! compile error - same issue, different error message 
*/ 

cpc[3] = 'a'; //OK of course, why not. 

希望します。

+0

cpc [3] = 'a';エラーが発生します。ポインタを別のアドレスを指すようにすることは可能ですか? – Angus

-1

私もこの回答を探していました。あなたがする必要があるのは、独自のタイプの配列を作成することです。

static const int TickerSize = 1000000; 
    int TickerCount; 
    typedef char TickerVectorDef[TickerSize]; 

また、この新しいタイプにポインタをキャストすることもできます。それ以外の場合は、 "コンパイラエラーC2440"が表示されます。しかし、固定サイズの配列でなければなりません。ポインタとしてのみ使用すると、実際のメモリは割り当てられません(ポインタ自体は4-8バイトを除く)。