Zeigertypen (C#-Programmierhandbuch)
In einem unsicheren Kontext kann ein Typ sowohl ein Zeigertyp als auch ein Werttyp oder Verweistyp sein.Eine Zeigertypdeklaration erfolgt in einer der folgenden Formen:
type* identifier;
void* identifier; //allowed but not recommended
Die folgenden Typen können Zeigertypen sein:
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal oder bool.
Beliebiger enum-Typ.
Beliebiger Zeigertyp.
Beliebiger benutzerdefinierter Strukturtyp, der nur Felder von nicht verwalteten Typen enthält.
Zeigertypen erben nicht von object, und es ist keine Konvertierung zwischen Zeigertypen und object möglich.Weiterhin unterstützen Boxing und Unboxing keine Zeiger.Es ist jedoch möglich, Konvertierungen zwischen verschiedenen Zeigertypen sowie zwischen Zeigertypen und ganzzahligen Typen durchzuführen.
Wenn Sie mehrere Zeiger innerhalb ein- und derselben Deklaration deklarieren, wird das * nicht als Präfix für jeden Zeigernamen, sondern nur einmal mit dem zugrunde liegenden Typ notiert.Beispiele:
int* p1, p2, p3; // Ok
int *p1, *p2, *p3; // Invalid in C#
Ein Zeiger kann nicht auf einen Verweis oder eine Struktur verweisen, die Verweise enthält, da ein Objektverweis auch dann in die Garbage Collection aufgenommen werden kann, wenn ein Zeiger darauf verweist.In der Garbage Collection wird nicht nachgehalten, ob von einem der Zeigertypen auf ein Objekt verwiesen wird.
Der Wert der Zeigervariablen vom Typ myType* ist die Adresse einer Variablen vom Typ myType.Im Folgenden finden Sie Beispiele für Zeigertypdeklarationen:
Beispiel |
Beschreibung |
---|---|
int* p |
p ist ein Zeiger auf einen ganzzahligen Wert. |
int** p |
p ist ein Zeiger auf einen Zeiger auf einen ganzzahligen Wert. |
int*[] p |
p ist ein eindimensionales Array von Zeigern auf ganzzahlige Werte. |
char* p |
p ist ein Zeiger auf eine char-Variable. |
void* p |
p ist ein Zeiger auf einen unbekannten Typ. |
Sie können den Zeigerdereferenzierungsoperator * verwenden, um auf den Inhalt an der Speicherstelle zuzugreifen, auf die die Zeigervariable zeigt.Betrachten Sie beispielsweise die folgende Deklaration:
int* myVariable;
Der Ausdruck *myVariable kennzeichnet die int-Variable, die sich an der in myVariable enthaltenen Adresse befindet.
Der Dereferenzierungsoperator kann nicht auf Zeiger vom Typ void* angewendet werden.Sie können jedoch eine Umwandlung verwenden, um einen void-Zeiger zu einem anderen Zeigertyp und umgekehrt zu konvertieren.
Ein Zeiger kann den Wert null annehmen.Die Anwendung des Dereferenzierungsoperators auf einen NULL-Zeiger führt zu einem in der Implementierung definierten Verhalten.
Beachten Sie, dass die Übergabe von Zeigern zwischen Methoden zu nicht definiertem Verhalten führen kann.Dies betrifft zum Beispiel die Rückgabe eines Zeigers an eine lokale Variable als Out-Parameter, Ref-Parameter oder als Funktionsergebnis.Wenn der Zeiger in einem fixed-Block festgelegt wurde, ist die Variable, auf die der Zeiger verweist, möglicherweise nicht fixiert.
In der folgenden Tabelle werden die Operatoren und Anweisungen aufgelistet, die in einem unsicheren Kontext auf Zeiger angewendet werden können.
Operator/Anweisung |
Verwendung |
---|---|
* |
Führt eine Zeigerdereferenzierung aus. |
-> |
Greift über einen Zeiger auf einen Member einer Struktur zu. |
[] |
Indiziert einen Zeiger. |
& |
Ruft die Adresse einer Variablen ab. |
++ und -- |
Inkrementiert und dekrementiert Zeiger. |
+ und - |
Führt Zeigerarithmetik aus. |
==, !=, <, >, <= und >= |
Vergleicht Zeiger. |
stackalloc |
Belegt Speicher für den Stapel. |
fixed-Anweisung |
Korrigiert eine Variable vorübergehend, damit die Adresse gefunden werden kann. |
C#-Programmiersprachenspezifikation
Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.
Siehe auch
Referenz
Unsicherer Code und Zeiger (C#-Programmierhandbuch)
Zeigerkonvertierungen (C#-Programmierhandbuch)
Zeigerausdrücke (C#-Programmierhandbuch)
Boxing und Unboxing (C#-Programmierhandbuch)