Преобразование указателя в массив в C++



Функция CreateFileMapping возвращает указатель на файл, сопоставленный с памятью, и я хочу рассматривать это сопоставление памяти как массив.



Вот что я в основном хочу сделать:



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


За исключением того, что, по-видимому, я не могу просто взмахнуть руками и объявить, что указатель теперь является массивом.



Ребята, у вас есть какие-нибудь идеи, как я могу это сделать? Я не хочу копировать значения, на которые указывает указатель, в массив, потому что это будет использовать слишком много памяти с большим размером файлы.

Большое Спасибо,

699   6  

6 ответов:

В этом нет необходимости. Указатель можно индексировать так, как если бы он был массивом:

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

В C/C++ указатели и массивы-это не одно и то же.

Но в вашем случае, для ваших целей они есть.

У вас есть указатель.

Вы можете дать ему индекс.

Например, указатель char * указывает на начало слова "hello"

Указатель[0] - это первый символ ' h '

Указатель[1] - это второй символ ' e '

Поэтому просто рассматривайте его так, как вы думаете о массиве.

" в C/C++ указатели и массивы-это не одно и то же.- верно, но имя переменной для массива совпадает с именем указателя const (это из моей старой черной книги Coriolis C++, насколько я помню). А именно:

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.

Надеюсь, это поможет.

Но чем указатель отличается от массива? Что не так с

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

Вы можете обращаться с Array более или менее так, как вы бы обращались с массивом отныне.

Можно использовать приведение в стиле C:

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

Или предпочтительное переинтерпретирование:

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

Я тоже искал этот ответ. Что вам нужно сделать, так это создать свой собственный тип массива.

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

Вы также можете привести указатель в этот новый тип. В противном случае вы получите "ошибка компилятора C2440". Однако это должен быть массив фиксированного размера. Если вы используете его только как указатель, фактическая память не выделяется (за исключением 4-8 байт для самого указателя).

Comments

    Ничего не найдено.