Meine ganz persönliche Meinung ist, dass Bilder mit Pfeilen in diese Richtung zeigen oder dass Zeiger schwerer zu verstehen sind. Es lässt sie wie abstrakte, mysteriöse Wesen erscheinen. Sie sind nicht.
Wie alles in Ihrem Computer sind Zeiger Zahlen . Der Name "Zeiger" ist nur eine ausgefallene Art zu sagen "eine Variable, die eine Adresse enthält".
Lassen Sie mich deshalb die Dinge aufrühren, indem ich erkläre, wie ein Computer tatsächlich funktioniert.
Wir haben eine int, es hat den Namen iund den Wert 5. Dies ist im Speicher gespeichert. Wie alles, was im Speicher gespeichert ist, benötigt es eine Adresse, sonst könnten wir sie nicht finden. Nehmen wir an, er ilandet an der Adresse 0x12345678 und sein Freund jmit dem Wert 6 endet direkt danach. Angenommen, eine 32-Bit-CPU mit int 4 Bytes und Zeigern 4 Bytes, werden die Variablen wie folgt im physischen Speicher gespeichert:
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
Nun wollen wir auf diese Variablen zeigen. Wir erstellen einen Zeiger auf int ,, int* ip1und einen int* ip2. Wie alles im Computer werden auch diese Zeigervariablen irgendwo im Speicher zugeordnet. Nehmen wir an, sie landen unmittelbar danach an den nächsten benachbarten Adressen im Speicher j. Wir setzen die Zeiger so, dass sie die Adressen der zuvor zugewiesenen Variablen enthalten: ip1=&i;("kopiere die Adresse von i in ip1") und ip2=&j. Was zwischen den Zeilen passiert, ist:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
Was wir also bekamen, waren noch einige 4-Byte-Speicherblöcke, die Zahlen enthielten. Es sind keine mystischen oder magischen Pfeile in Sicht.
Wenn wir uns nur einen Speicherauszug ansehen, können wir nicht sagen, ob die Adresse 0x12345680 ein intoder enthältint* . Der Unterschied besteht darin, wie unser Programm die unter dieser Adresse gespeicherten Inhalte verwendet. (Die Aufgabe unseres Programms besteht eigentlich nur darin, der CPU mitzuteilen, was mit diesen Zahlen zu tun ist.)
Dann fügen wir noch eine weitere Indirektionsebene mit hinzu int** ipp = &ip1;. Wieder bekommen wir nur einen Teil der Erinnerung:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
Das Muster kommt mir bekannt vor. Noch ein Teil von 4 Bytes, der eine Zahl enthält.
Wenn wir nun einen Speicherauszug des obigen fiktiven kleinen RAM hätten, könnten wir manuell überprüfen, wohin diese Zeiger zeigen. Wir schauen uns an, was unter der Adresse der ippVariablen gespeichert ist, und finden den Inhalt 0x12345680. Welches ist natürlich die Adresse, wo ip1gespeichert wird. Wir können zu dieser Adresse gehen, den Inhalt dort überprüfen und die Adresse von finden i, und schließlich können wir zu dieser Adresse gehen und die Nummer 5 finden.
Wenn wir also den Inhalt von ipp nehmen, erhalten *ippwir die Adresse der Zeigervariablen ip1. Durch das Schreiben *ipp=ip2kopieren wir ip2 in ip1, es entspricht ip1=ip2. In jedem Fall würden wir bekommen
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(Diese Beispiele wurden für eine Big-Endian-CPU angegeben.)
ippbei der Definition hinzu, damit Ihre Frage vollständig ist ;-)