Verwendung der Zeiger-Ampersand-Notation in C
-
Benutzen Sie die
&var
Notation, um die Adresse einer gegebenen Variable zu erhalten -
Verwendung der Notation
*ptr
für den Zugriff auf den Wert einer Variablen vom Zeiger -
Verwendung der Ampersand-Notation
&
zur Übergabe der Adresse von Objekten an Funktionen
In diesem Artikel werden mehrere Methoden zur Verwendung der Zeiger-Ampersand-Notation in C vorgestellt.
Benutzen Sie die &var
Notation, um die Adresse einer gegebenen Variable zu erhalten
Zeiger sind einfach Variablen, die die Speicheradressen enthalten. Sie werden mit der Notation type *var
deklariert. Dem Zeiger kann eine beliebige Adresse desselben Typs zugewiesen werden, und jeder Zeigertyp kann den void*
-Zeiger speichern, was als generischer Zeiger bezeichnet wird. Da wir einen Typ haben, der die Adressen von Objekten speichert, sollte es einen Operator geben, der den Zugriff auf ein Objekt ermöglicht.
Das kaufmännische Und-Symbol &
wird als unärer Operator verwendet, der oft auch als Adresse-von
-Operator bezeichnet wird. Er kann auf Datenobjekte und Funktionen angewendet werden, um die Adresse abzurufen, unter der das Objekt gespeichert ist.
Angenommen, wir haben eine Ganzzahl x
deklariert und initialisiert, wie im folgenden Beispiel gezeigt. In diesem Fall können wir seine Adresse mit dem kaufmännischen Operator &
nehmen und sie der Variablen int *xptr
zuweisen. Als Ergebnis zeigt xptr
auf den Wert 10233, und der Operator *
kann verwendet werden, um im nachfolgenden Code auf seinen Wert zuzugreifen.
Beachten Sie, dass das Sternchen *
hier in zwei verschiedenen Zusammenhängen verwendet wird. Der eine ist die Deklaration einer Variablen vom Typ Zeiger. Der andere ist der Zugriff auf den Wert von vom Zeiger auf die Variable, wobei letzteres als Dereferenzierung bezeichnet wird.
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10233;
int *xptr = &x; // xptr now points to x
printf("x: %d\n", x);
printf("*xptr: %d\n", *xptr);
exit(EXIT_SUCCESS);
}
Ausgabe:
x: 10233
*xptr: 10233
Verwendung der Notation *ptr
für den Zugriff auf den Wert einer Variablen vom Zeiger
Der Dereferenzierungsoperator kann verwendet werden, um Werte aus den Zeigern abzurufen und sie Variablen des gleichen Typs zuzuweisen. Beachten Sie, dass der *
-Operator nicht mit null
oder ungültigen Zeigern verwendet werden kann, da dies zu undefiniertem Verhalten führt. In den meisten Szenarien wird das Programm wahrscheinlich abstürzen, wenn man den null
-Zeiger verwendet. Wenn jedoch auf den ungültigen Zeiger zugegriffen wird, kann dies unbemerkt bleiben. Ein ungültiger Zeiger kann auf ein beliebiges Objekt im Speicher zeigen, und Operationen darauf werden trotzdem ausgeführt, aber es kann die Korrektheit des Programmzustands beeinträchtigen.
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10233;
int *xptr = &x; // xptr now points to x
int y = *xptr; // y now holds the value 10233
printf("x: %d\n", x);
printf("y: %d\n", y);
exit(EXIT_SUCCESS);
}
Ausgabe:
x: 10233
y: 10233
Verwendung der Ampersand-Notation &
zur Übergabe der Adresse von Objekten an Funktionen
Das häufigste Beispiel für die Verwendung des Adress-Operators ist die Übergabe eines Zeigers auf das Objekt als Funktionsargument. Das folgende Beispiel demonstriert die Funktion swap
, die zwei Integer-Zeiger als Argumente annimmt. Beachten Sie, dass, wenn swap
von der Funktion main
aufgerufen wird, der kaufmännische Operator verwendet wird, um die Adressen der Variablen x
und y
zu übergeben. Beachten Sie jedoch, dass der *
-Operator im Körper der swap
-Funktion die Zeiger-Dereferenzierung bezeichnet.
#include <stdio.h>
#include <stdlib.h>
void swap(int *x, int *y) {
int tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int x = 10233;
int y = 10133;
printf("x:%d, y:%d\n", x, y);
swap(&x, &y);
printf("x:%d, y:%d\n", x, y);
exit(EXIT_SUCCESS);
}
Ausgabe:
x:10233, y:10133
x:10133, y:10233
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook