Ich kann die Antwort hier nicht finden, aber es tut mir leid, wenn das ein Duplikat ist. Hier ist meine Frage: Wenn ich zwei Zeiger auf den gleichen Ort habe, dann ändere ich die Adresse von einem (sagen wir Zeiger A), werde ich (zufällig) die Adresse des anderen Zeigers ändern (Zeiger B)? Oder bleibt der Standort von Zeiger B gleich?Zwei Zeiger auf den gleichen Ort?
Antwort
Bild sagt mehr als tausend Worte.
Zeiger weisen auf einen anderen Speicher Platz, zur gleichen Zeit, sie haben ihre eigenen Speicherplatz.
Zwei Zeiger, A und B, zeigen auf dieselbe Stelle, aber sie werden in getrennten Speicherplätzen gehalten. (Linke Hälfte des Bildes)
Wenn Sie B ändern, ändern Sie nur, was B zeigt, A bleibt gleich. (Rechte Hälfte des Bildes)
Das Ändern des Inhalts eines Zeigers (im Gegensatz zu dem Objekt, auf das verwiesen wird) hat keine Auswirkung auf andere Zeiger auf dasselbe Objekt.
Was meinen Sie genau damit, das Objekt, auf das gezeigt wird, zu ändern? Das Ändern seines Werts hat nichts mit seiner Adresse zu tun. – Jarvis
@Jarvis Ich nahm an, dass sich die Frage auf die vom Zeiger gespeicherte Adresse und nicht auf die Adresse des Zeigers bezog. Ich beziehe mich auf das "Objekt, auf das gezeigt wird" als einen Kontrast zwischen dem Inhalt des Zeigers (einer Adresse), der geändert werden kann, ohne andere Zeiger zu beeinflussen, und dem Objekt, das an dieser Adresse geändert wird, was sich auf andere Zeigern auswirkt. –
Sie können die Ausgabe des folgenden Code sehen:
#include <iostream>
int main(int argc, char **argv){
int a = 3, d = 4;
int *b = &a, *c = &a;
std::cout << b << ", " << c << std::endl;
b = &d;
std::cout << b << ", " << c << std::endl;
}
Im Folgenden ist der Ausgang des Code:
0x7ffca3788e40, 0x7ffca3788e40
0x7ffca3788e44, 0x7ffca3788e40
Klar, die Änderung der Adresse b
Punkte, hat nichts zu tun mit der Adresse, auf die der Zeiger c
zeigt.
Aber Sie können ein fast ähnliches Phänomen haben, wenn Sie references
verwenden. Eine Referenz ist eine Entität, die ein Alias für ein anderes Objekt ist. Angenommen, Sie
int &ref = a;
ref = 5;
Jetzt haben die Variable ref
Veränderung wird auch eine Änderung der Wert der Variablen a
bringen, das entspricht es bis 5.
Ein Zeiger hält die Speicheradresse eines Stückes von Daten im Speicher .
Der Wert der Zeigervariable ist diese Adresse.
int targetA = 1;
int targetB = 2;
int *pointerA = &targetA;
int *pointerB = &targetA;
printf("%p, %p\n", pointerA, pointerB);
// => 0x7fff5c78e8f8, 0x7fff5c78e8f8
pointerB = &targetB;
printf("%p, %p\n", pointerA, pointerB);
// => 0x7fff5c78e8f8, 0x7fff5c78e8f4
Durch eine andere Adresse/Lage auf den Zeiger Zuordnung ändern Sie genau das, was er zeigt, sind andere Variablen nicht affeted.
Die Position von Zeiger B bleibt gleich.
Da Zeiger A und Zeiger B unterschiedliche Zeiger sind, haben sie unterschiedliche Speicheradressen. Das bedeutet, dass sie unabhängig voneinander sind, obwohl beide auf die gleiche Speicheradresse zeigen.
Aber Sie sollten vorsichtig sein, wenn Sie versuchen, den Inhalt von Zeiger A zu ändern, dieser Vorgang kann dazu führen, dass Zeiger B versehentlich wilder Zeiger ist!
Werfen wir einen Blick auf dieses Code-Snippet.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int * myp1, * myp2;
int myvalue;
myp1 = &myvalue;
myp2 = &myvalue;
myvalue = 10;
cout << "first address is " << myp1 << '\n';
cout << "second address is " << myp2 << '\n';
Hier sind die Ausgänge das gleiche (wenn ich es laufen, bekomme ich erste Adresse ist 0x759ba27bb1d8 zweite Adresse ist 0x759ba27bb1d8).
int myvalue2;
myp1 = &myvalue2;
myvalue2 = 20;
cout << "first address is " << myp1 << '\n';
cout << "second address is " << myp2 << '\n';
return 0;
} Hier werden die Adressen sind unterschiedlich, aber myp2 Punkte auf die gleiche Adresse wie oben.
Und es macht Sinn; Sie haben zwei verschiedene Dinge, die auf dieselbe Adresse zeigen. Warum sollte man das ändern, was das eine zeigt, das andere ändern?
Eine (möglicherweise sehr schlechte Analogie) wäre: bedenken Sie, dass Sie und jemand am anderen Ende der Welt in den Himmel zeigen (sagen wir, am selben Punkt am Himmel). Dann zeigst du auf den Boden. Nur weil du auf den Boden deutetest, bedeutet das nicht, dass der andere Kerl aufhört, in den Himmel zu zeigen.
Hoffe, dass hilft.
- 1. mvc Multiples Routen für den gleichen Ort
- 2. c - Warum zeigen alle auf den gleichen Ort?
- 3. Common Lisp CFFI: Zeiger auf den Zeiger
- 4. Zeiger auf Zeiger ... auf Zeiger?
- 5. Zwei verschiedene Klasseninstanzen geben den gleichen Hashcode
- 6. Warum kann ich den Zeiger auf den Zeiger auf N in C nicht initialisieren und deklarieren?
- 7. Zwei Formen teilen sich den gleichen Eingang
- 8. Einen Zeiger, der auf zwei Bytes Punkte
- 9. Muster auf zwei Datensätze mit den gleichen Feldern
- 10. PHP - Merge zwei Arrays auf den gleichen Schlüssel
- 11. EF-Code Zuerst Karte zwei Navigationseigenschaften auf den gleichen Objekttyp
- 12. Zeigen Sie zwei Variablen auf den gleichen Wert in Python
- 13. Wie zwei Klassen Eigenschaften auf den gleichen Wert Referenz machen
- 14. Ist es möglich, Web-Crawlern mitzuteilen, dass zwei Domains auf den gleichen Ort zeigen, ohne eine 301-Weiterleitung zu verwenden?
- 15. Aufruf auf das gleiche Objekt auf zwei Zeiger löschen
- 16. Zwei Bundles mit den gleichen Entitäten Symfony2
- 17. Spielemacher zwei Spieler gleichen Bildschirm bewegen zwischen den Zimmern Ausgabe
- 18. Haben diese Aussagen über Zeiger den gleichen Effekt?
- 19. Java, arbeitet parallel auf den gleichen Daten
- 20. zwei Dateihandler von zwei verschiedenen Loggern erhalten den gleichen Inhalt
- 21. Lösche Zeiger in zwei Listen
- 22. Zeiger auf Zeiger auf Struct
- 23. Zeiger auf Zeiger auf verschachtelte Struktur
- 24. Kosten einer Referenz auf die Referenz static_cast und ein Zeiger auf den Zeiger static_cast
- 25. Zeiger in den Funktionen
- 26. Zeiger auf Zeiger Array
- 27. Zwei Mausevents auf der gleichen Taste eckig
- 28. Zwei schließt sich auf der gleichen Tabellen
- 29. Zwei Threads arbeiten auf der gleichen Liste
- 30. Wie kann man Speicher freigeben, auf den zwei Zeiger in C zeigen?
Ihre Frage wäre perfekt mit einem [mcve] – Stargateur
"Adresse des Zeigers" ist die Adresse der Zeigervariablen selbst. Du kannst es nicht ändern. Worüber Sie wahrscheinlich sprechen, ist der * Wert * des Zeigers, d. H. Adresse, die * in * dem Zeiger gespeichert ist. Wenn ja, nennen Sie es nicht "Adresse des Zeigers". – AnT
Mit "die Adresse von [dem Zeiger] ändern", meinst du, es einfach mit '=' neu zuzuweisen, um auf etwas anderes zu zeigen? – ApproachingDarknessFish