Basierte Zeiger (C++)

Mit dem __based Schlüsselwort können Sie Zeiger basierend auf Zeigern deklarieren (Zeiger, die von vorhandenen Zeigern versetzt werden). Das __based Schlüsselwort ist microsoftspezifisch.

Syntax

type __based( base ) declarator

Hinweise

Zeiger basierend auf Zeigeradressen sind die einzige Form des Schlüsselworts, das __based in 32-Bit- oder 64-Bit-Kompilierungen gültig ist. Für den 32-Bit-C/C++Compiler von Microsoft ist ein basierter Zeiger ein 32-Bit-Offset von einer 32-Bit-Zeigerbasis. Eine ähnliche Einschränkung besteht für 64-Bit-Umgebungen, in denen ein basierter Zeiger ein 64-Bit-Offset von der 64-Bit-Basis ist.

Eine Verwendung von Zeigern, die auf Zeigern basieren, ist für dauerhafte Bezeichner, die Zeiger enthalten. Eine verknüpfte Liste, die aus Zeigern auf Grundlage eines Zeigers besteht, kann auf Datenträger gespeichert werden, dann an eine andere Stelle im Arbeitsspeicher neu geladen werden, wobei die Zeiger weiterhin gültig bleiben. Beispiel:

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

Dem Zeiger vpBuffer wird die Adresse des später im Programm zugewiesenen Arbeitsspeichers zugeteilt. Die verknüpfte Liste wird relativ zum Wert von vpBuffer verschoben.

Hinweis

Das Beibehalten von Bezeichnern, die Zeiger enthalten, kann auch mithilfe von Speicher zugeordneten Dateien erreicht werden.

Beim Dereferenzieren eines basierten Zeigers muss die Basis explizit angegeben werden oder implizit durch die Deklaration bekannt sein.

Für die Kompatibilität mit früheren Versionen ist _based ein Synonym, es __based sei denn, Compileroption /Za (Spracherweiterungen deaktivieren) wird angegeben.

Beispiel

Im folgenden Code wird gezeigt, wie ein Basiszeiger verändert wird, indem seine Basis geändert wird.

// 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;
}
1
2
10
11

Weitere Informationen

Schlüsselwörter
alloc_text