int *
bedeutet "ein Zeiger auf ein int." Also, hier ist buff
ein Zeiger auf ein int. Um die Dinge einfacher zu machen, lassen Sie uns auch sagen:
int x = 5;
int *buff = &x;
x
, eine ganze Zahl, wird auf 5 gesetzt &x
bedeutet „die Adresse von x“. So enthält buff
die Adresse x
. Nehmen wir als Argument an, dass x
bei Speicheradresse 0x1000 gespeichert ist. Also buff
selbst ist auch eine Nummer: 0x1000.
*buff
bedeutet „das, was auf dem durch Schwabbelscheibe“, in diesem Fall 5
&buff
bedeutet „die Adresse des Schwabbelscheibe“: die Adresse, unter der Nummer buff
selbst im Speicher abgelegt ist.
Ich möchte eine allgemeine Technik teilen, die ich gelernt habe, wie Zeiger funktionierten, als ich anfing.
Holen Sie sich ein großes Blatt Millimeterpapier und legen Sie es in Längsrichtung auf den Tisch vor Ihnen. Dies ist der Speicher Ihres Computers. Jede Box repräsentiert ein Byte. Wählen Sie eine Reihe aus und legen Sie die Zahl "100" unter das Feld ganz links. Dies ist "die niedrigste Adresse" des Speichers. (Ich wählte 100 als eine beliebige Zahl, die nicht 0 ist, Sie können eine andere wählen.) Nummerieren Sie die Kästchen in aufsteigender Reihenfolge von links nach rechts.
+---+---+---+---+---+--
| | | | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Jetzt, nur für den Moment, vorgeben, ein int ist ein Byte groß. Sie sind ein Acht-Bit-Computer. Schreiben Sie Ihre int a
in eine der Boxen. Die Nummer unter der Box ist ihre Adresse. Wählen Sie nun eine andere Box, die int *b = &a
enthalten soll. int *b
ist auch eine Variable irgendwo im Speicher gespeichert, und es ist ein Zeiger, der &a
enthält, die "a's Adresse" ausgesprochen wird.
int a = 5;
int *b = &a;
a b
+---+---+---+---+---+--
| 5 | |100| | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Jetzt können Sie dieses Modell verwenden, um visuell durch andere Kombinationen von Werten und Zeigern arbeiten, die Sie sehen. Es ist eine Vereinfachung (weil als Sprache Pedanten sagen, ein Zeiger ist nicht unbedingt eine Adresse, und Speicher ist nicht notwendigerweise sequentiell, und es gibt Stapel und Heap und Register und so weiter), aber es ist ein ziemlich gut Analogie für 99% der Computer und Mikrocontroller.
Sie können das Modell für echte Vier-Byte erweitern int
zu s ...
int a = 5;
char b = 2;
a a a a b
+---+---+---+---+---+--
| 0 | 0 | 0 | 5 | 2 | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Der unäre '*' und '' & Operatoren sind invers zueinander sind. Für alle "x" ist immer wahr, dass "* (& x) == x", und für alle gültigen Zeiger "x" gilt immer "& (* x) == x" (wenn "x" nicht ist) ein Zeiger, dann macht 'x' keinen Sinn und ist ein Syntaxfehler, wenn 'x' ein ungültiger Zeiger ist, dann ist '* x' syntaktisch gültig, führt aber zur Laufzeit zu undefiniertem Verhalten. –