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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für