Basierte Zeiger (C++)

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

Syntax

type __based( base ) declarator

Hinweise

Zeiger, die auf Zeigeradressen basieren, sind die einzige Form der Schlüsselwort (keyword), die __based in 32-Bit- oder 64-Bit-Kompilierungen gültig sind. 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 Speichern von Bezeichnern, die Zeiger enthalten, kann auch mithilfe von speicherzuordnungen Dateien erreicht werden.

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

Zur Kompatibilität mit früheren Versionen ist _based ein Synonym, __based es sei denn, die Compileroption /Za (Spracherweiterungen deaktivieren) ist 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

Siehe auch

Schlüsselwörter
alloc_text