Wskaźniki bazowe (C++)
Specyficzne dla firmy Microsoft
Słowo kluczowe __based umożliwia zadeklarowanie wskaźników na podstawie innych wskaźników (wskaźniki, które są przesunięciami innych wskaźników).
type __based( base ) declarator
Uwagi
Wskaźniki oparte na adresach wskaźników są jedyną prawidłową postacią słowa kluczowego __based w kompilacjach 32- i 64-bitowych.Dla 32-bitowego kompilatora Microsoft C/C++, wskaźnik bazowy jest 32-bitowym przesunięciem bazy wskaźnika 32-bitowego.Podobne ograniczenie istnieje w środowiskach 64-bitowych, gdzie wskaźnik bazowy jest 64-bitowym przesunięciem bazy 64-bitowej.
Jedno z zastosowań dla wskaźników bazowych odnosi się do trwałych identyfikatorów zawierających wskaźniki.Połączona lista, która składa się ze wskaźników opartych na wskaźnikach może być zapisana na dysku, a następnie ponownie załadowana do innego miejsca w pamięci, z wciąż prawidłowymi wskaźnikami.Na przykład:
// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
void __based( vpBuffer ) *vpData;
struct llist_t __based( vpBuffer ) *llNext;
};
Wskaźnik vpBuffer ma przypisany adres pamięci przydzielonej w pewnym późniejszym momencie w programie.Połączona listy jest przenoszona względem wartości vpBuffer.
[!UWAGA]
Można uzyskać trwałe identyfikatory zawierające wskaźniki także za pomocą plików mapowanych w pamięci.
Podczas wyłuskiwania wskaźnika bazowego, baza musi być jawnie określona lub niejawnie znana poprzez deklarację.
W celu zachowania zgodności z poprzednimi wersjami _based jest synonimem dla __based.
Przykład
W poniższym kodzie przedstawiono zmianę wskaźnika bazowego, zmieniając jego bazę.
// 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;
}