2011-01-07 14 views
7

Ein Zeiger, der als Referenz übergeben wird. Warum? sind Zeiger nicht nur Referenzen? Was passiert wirklich mit diesem Parameter?C++ Zeiger (Pass By Reference) Frage

void someFunc(MyPtr*& Object) 
{ 

} 
+1

"sind Zeiger nicht nur Referenzen?" - Hier ist eine leichte Zweideutigkeit. In der allgemeinen Informatik sind Zeiger eine Art Referenz.C++ verwendet jedoch dasselbe Wort "Verweis", um eine bestimmte Sprachenfunktion zu bezeichnen. C++ Referenzen sind auch eine Art Referenz, aber sie sind eine * andere * Art von Referenz, und Zeiger sind keine C++ Referenzen. –

+0

@ Steve Jessop: +1 ähnliche Gründe ließ mich meine Antwort auch schreiben. Ref Vs Pointer nettes visuelles Dokument -> http://www.dgp.toronto.edu/~patrick/csc418/wi2004/notes/PointersVsRef.pdf scheint nur, dass es immer eine Menge Verwirrung verursachen wird. Ähnliches ist in C#, aber viele Leute erkennen nicht, dass es sogar ein Problem gibt - tatsächlich ist es sogar noch komplexer als C++, wenn es ref & pass by value durchläuft, weil es logische Ebenen über C++ - Konzepte hat. Schade, dass nur wenige Leute realisieren, dass C# tatsächlich komplexer ist als C++, wenn es darum geht, was "Zeiger" ist (hier nicht von unsicherem Code zu sprechen) – user44298

+0

cont. Aber es ist wirklich einfach, wenn Sie es so sehen: Wenn Computer Daten speichern (eine Variable zum Beispiel), haben die Daten nur 2 Merkmale: (1) eine Adresse im Speicher & (2) Wert an dieser Adresse geschrieben . Das sind irgendwelche Daten. Zeiger und Referenzen und solche Abstraktionen werden zur Vereinfachung eingeführt. Jedes Medium, das Daten wie zum Beispiel DVDs speichert, ist dasselbe wie ein Papierbuch: Sie haben eine Seite, auf der Sie einen Satz geschrieben haben - es ist derselbe - Sie müssen die (1) Information (2) irgendwo schreiben. Träume auf der anderen Seite können komplexer sein, so weit Speicher geht :) – user44298

Antwort

7

Einfach gesagt, es gibt Ihnen die Möglichkeit die Zeiger selbst zu ändern: es an einem anderen Ort in der Funktion Punkt geändert werden kann. Und die Änderung wird nach außen reflektiert werden.

1

Andere müssen stimmen, um dies zu überprüfen, weil ich auf meinem C++ etwas rostig bin, aber ich glaube, die Idee hier ist, Sie würden einen Zeiger als Referenz übergeben, das heißt, einen neuen Speicherbereich zu erstellen Zeiger selbst verwenden Sie einen Verweis auf den Zeiger so, wenn Sie den Zeiger nicht nur den Wert ändern würde es nach der Rückkehr von der Funktion geändert werden, während sonst alles, was Sie tun können, ist der Wert an Position übergeben. Hoffnung, die Sinn macht .

0

Es bedeutet auch, dass der Zeiger 0 (NULL) sein kann, was eine Bedeutung für die Methode haben kann. Eine Referenz muss immer gültig sein und kann nicht "nichts" gemacht werden.

1

Der Unterschied zur Übergabe nur eines Zeigers besteht darin, dass diese Änderung von der aufrufenden Funktion erkannt wird, wenn der Zeiger geändert wird (Object = x). Sie könnten dasselbe erreichen, wenn Sie MyPtr** Object übergeben und den Zeiger *Object = x; dereferenzieren. Mit dem zweiten Ansatz könnten Sie NULL an die Funktion übergeben. Dies ist für Referenzen nicht möglich.

5

Es ermöglicht:

void someFunc(MyPtr*& Object) 
{ 
    //Modify what Object is pointing to 
    Object=&old_Object; 

    //You can also allocate memory, depending on your requirements 
    Object=new MyPtr; 

    //Modify the variable Object points to 
    *Object=another_object; 
} 
+0

Haben wir nicht ein Speicherleck in der oben genannten Situation? – Mahesh

+1

@Mahesh Nein, solange der Anrufer weiß, dass er das neue Objekt löschen muss, wenn es fertig ist – trojanfoe

1

Sie sind nicht ganz richtig. Der Zeiger Inhalt wird als Verweis übergeben, aber der Zeiger selbst wird immer noch als Wert übergeben, dh das Umsetzen auf einen anderen Zeiger wird beim Beenden der Methode nicht berücksichtigt, da der Zeiger so eingestellt wird, dass er auf denselben Speicherblock verweist vor dem Anruf. Betrachten Sie es als eine einfache int-Variable. Mit & * oder ** können Sie jedoch den Zeiger neu zuweisen und das wird außerhalb des Bereichs dieser Methode sichtbar sein.

1

Warum?

Aus dem gleichen Grund, dass Sie alles andere als Referenz übergeben würden.

sind Zeiger nicht nur Referenzen?

Lieber Gott, nein. Nicht einmal im Entferntesten das Gleiche. Sieh mal, du kannst versuchen ein geistiges Modell einer Referenz von beginnend mit einen Zeiger zu bauen, aber bis Sie alle Unterschiede behoben haben, haben Sie eine schreckliche unlogische Unordnung.

Referenzen sind ein viel einfacheres und intuitiveres Konzept, und es gibt nur "historische Gründe" dafür, Zeiger vor ihnen zu verstehen. Modernes C++ verwendet rohe Zeiger nur selten und behandelt sie so weit wie möglich als Implementierungsdetail.

Eine Referenz ist ein anderer Name für eine bereits existierende Sache. Das ist es. Wenn sie als Funktionsparameter verwendet werden, ermöglichen sie somit, dass die aufgerufene Funktion auf die Daten des Anrufers verweist.