Преобразование указателя в массив в C++
Функция CreateFileMapping возвращает указатель на файл, сопоставленный с памятью, и я хочу рассматривать это сопоставление памяти как массив.
Вот что я в основном хочу сделать:
char Array[] = (char*) CreateFileMapping(...);
За исключением того, что, по-видимому, я не могу просто взмахнуть руками и объявить, что указатель теперь является массивом.
Ребята, у вас есть какие-нибудь идеи, как я могу это сделать? Я не хочу копировать значения, на которые указывает указатель, в массив, потому что это будет использовать слишком много памяти с большим размером файлы.
Большое Спасибо,
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