Essenz:
Referenz ist ein Alias, Zeiger ist eine Adresse
Spezifisch:
1. Phänomenal gesehen kann ein Zeiger den Wert, auf den er zeigt, zur Laufzeit ändern, eine Referenz ändert sich jedoch nicht, sobald sie an ein Objekt gebunden ist. Dieser Satz kann wie folgt verstanden werden: Ein Zeiger kann neu zugewiesen werden, um auf ein anderes Objekt zu zeigen. Die Referenz verweist jedoch immer auf das bei der Initialisierung angegebene Objekt und kann später nicht mehr geändert werden, der Inhalt des angegebenen Objekts kann jedoch geändert werden.
2. Aus Sicht der Speicherzuweisung weist das Programm einen Speicherbereich für Zeigervariablen zu, nicht jedoch für Referenzen, da die Referenz initialisiert werden muss, wenn sie als Hinweis auf ein bereits vorhandenes Objekt deklariert wird. Referenzen können nicht auf Nullwerte verweisen.
3. Aus Kompilierungssicht fügt das Programm während der Kompilierung Zeiger und Referenzen zur Symboltabelle hinzu. Die Symboltabelle zeichnet den Variablennamen und die der Variablen entsprechende Adresse auf. Der entsprechende Adresswert der Zeigervariablen in der Symboltabelle ist der Adresswert der Zeigervariablen, und der entsprechende Adresswert der Referenz in der Symboltabelle ist der Adresswert des referenzierten Objekts.
Die Symboltabelle wird nach ihrer Generierung nicht geändert, sodass der Zeiger das Objekt ändern kann, auf das er zeigt (der Wert in der Zeigervariablen kann geändert werden), das Referenzobjekt jedoch nicht. Dies ist der Hauptgrund, warum die Verwendung von Zeigern unsicher ist und die Verwendung von Referenzen sicher ist. In gewisser Weise kann man sich eine Referenz als einen Zeiger vorstellen, der nicht geändert werden kann.
4. Die Tatsache, dass es keinen Verweis auf einen Nullwert gibt, bedeutet, dass Code, der Referenzen verwendet, effizienter ist als die Verwendung von Zeigern. Denn es besteht keine Notwendigkeit, die Gültigkeit einer Referenz vor der Verwendung zu testen. Im Gegensatz dazu sollten Zeiger immer getestet werden, um zu verhindern, dass sie null sind.
5. Theoretisch gibt es keine Begrenzung für die Ebene der Zeiger, aber die Referenz kann nur eine Ebene sein. Wie folgt:
int** p1; // 合法。指向指针的指针 int*& p2; // 合法。指向指针的引用 int&* p3; // 非法。指向引用的指针是非法的 int&& p4; // 非法。指向引用的引用是非法的
Achtung! Die obige Lesart erfolgt von links nach rechts.
Empfohlenes Tutorial: PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen PHP-Referenzen und Zeigern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!