2

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

これが私が基本的にやりたいことです:

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

どうやら私は単に腕を振って、ポインタが配列になったことを宣言することはできません。

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

本当にありがとう、

4

6 に答える 6

22

あなたはそれをする必要が無い。ポインタを配列であるかのようにインデックス付けできます。

char* p = (char*)CreateFileMapping(...);
p[123] = 'x';
...
于 2009-08-20T22:15:19.660 に答える
5

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

しかし、あなたの場合、あなたの目的のためにそれらはそうです。

ポインターがあります。

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

たとえば、char* ポインタは「hello」の先頭を指します

pointer[0] は最初の文字 'h' です

pointer[1] は 2 番目の文字 'e' です

したがって、配列について考えているように扱ってください。

于 2009-08-20T22:17:02.557 に答える
2

「C/C++ では、ポインターと配列は同じものではありません。」は true ですが、配列の変数名はポインター 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.

お役に立てれば。

于 2009-09-04T18:22:15.277 に答える
1

C スタイルのキャストを使用できます。

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

または、推奨される再解釈キャスト:

char *p std::reinterpret_cast<char*>(CreateFileMapping(...));
p[123] = 'x';
于 2009-08-21T05:24:54.943 に答える
1

しかし、ポインターは配列とどう違うのでしょうか? どうしたの

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

Arrayこれからは、配列を扱うように多かれ少なかれ扱うことができます。

于 2009-08-20T22:16:14.430 に答える
-2

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

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

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

于 2011-05-26T09:23:18.137 に答える