2017-02-08 2 views
-1

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?

+2

Ihre Frage wäre perfekt mit einem [mcve] – Stargateur

+1

"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

+0

Mit "die Adresse von [dem Zeiger] ändern", meinst du, es einfach mit '=' neu zuzuweisen, um auf etwas anderes zu zeigen? – ApproachingDarknessFish

Antwort

2

Bild sagt mehr als tausend Worte.

picture speaks a thousand word

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)

5

Das Ändern des Inhalts eines Zeigers (im Gegensatz zu dem Objekt, auf das verwiesen wird) hat keine Auswirkung auf andere Zeiger auf dasselbe Objekt.

+0

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

+0

@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. –

1

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.

1

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.

2

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!

0

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.

Verwandte Themen