Основанные указатели (C++)

Блок, относящийся только к системам Microsoft

Ключевое слово __based позволяет объявлять указатели на основе указателей (указатели со смещением относительно существующих указателей).

type __based( base ) declarator

Заметки

Указатели, основанные на адресах указателей, являются единственной формой ключевого слова __based, допустимой в 32- или 64-разрядных компиляциях. В 32-разрядном компиляторе Microsoft C/C++ относительный указатель имеет 32-разрядное смещение от 32-разрядной базы указателя. То же ограничение действует и для 64-разрядных сред, где относительный указатель имеет 64-разрядное смещение от 64-разрядной базы указателя.

Указатели на основе указателей, в частности, используются для постоянных идентификаторов, которые содержат указатели. Связанный список, состоящий из указателей на основе указателей, можно сохранить на диск, а затем перезагрузить в другое место в памяти. При этом все указатели останутся действительными. Например:

// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
   void __based( vpBuffer ) *vpData;
   struct llist_t __based( vpBuffer ) *llNext;
};

Указателю vpBuffer назначается адрес в памяти, который выделяется на более позднем этапе программы. Связанный список перемещается относительно значения vpBuffer.

Примечание

Постоянные идентификаторы, содержащие указатели, можно также создавать при помощи сопоставленных в памяти файлов.

Когда выполняется разыменовывание относительных указателей, база должна быть либо явно указана, либо неявно известна из объявления.

В целях совместимости с предыдущими версиями ключевые слова _based и __based синонимичны.

Пример

В следующем примере демонстрируется изменение относительного указателя путем изменения его базы.

// based_pointers2.cpp
// compile with: /EHsc
#include <iostream>

int a1[] = { 1,2,3 };
int a2[] = { 10,11,12 };
int *pBased;

typedef int __based(pBased) * pBasedPtr;

using namespace std;
int main() {
   pBased = &a1[0];
   pBasedPtr pb = 0;

   cout << *pb << endl;
   cout << *(pb+1) << endl;

   pBased = &a2[0];

   cout << *pb << endl;
   cout << *(pb+1) << endl;
}
  

См. также

Ссылки

Ключевые слова в C++

alloc_text