Bedeutung von pass by reference in C und C++?
Ich bin verwirrt über die Bedeutung von "pass by reference" in C und C++.
In C gibt es keine Referenzen. Also ich denke, pass by reference bedeutet, wird ein Zeiger übergeben. Aber dann warum nicht rufen Sie übergeben, indem Zeiger?
In C++, wir haben beide Zeiger und Referenzen (und Sachen wie Iteratoren liegt ganz in der Nähe). Also, was bedeutet übergabe per Referenz hier bedeuten?
- In C gibt es Referenzen, und AFAIK Sie Verhalten sich genauso wie in C++
- Siehe stackoverflow.com/questions/57483/... und stackoverflow.com/questions/2229498/passing-by-reference-in-c
- "Pass by reference" ist ein fester Begriff und in C sollte es nicht verwendet werden. "Passing ein "Referenz" verwendet werden kann, obwohl, weil, dass kann bedeuten, die Adresse wird zuerst genommen. Und Iteratoren sind nicht in der Nähe dieser Grundtypen.
- Im Allgemeinen ist ein Zugriff auf die variable, die erlaubt, um den Wert zu ändern die er sich bezieht... In C, die Sie tun können dereferenzieren eines Zeigers, so dass der Begriff der Referenz ist auch gültig...
- Flagge als doppelte.
- Ah, ich dachte, ich war von flags, die heute schon 🙂
- Mir wurde gesagt, es bedeutet nur, dass Sie nicht über eine doppelte variable, sondern der Verweis darauf. Es ist ganz gut, weil es nicht brauchen, das Programm zu kopieren, der variable. Zum Beispiel, das kopieren einer Klasse könnte sehr lange dauern, oder Töne der Erinnerung. Wenn Sie einfach übergeben Sie die Referenz, die Sie arbeiten werden auf die Klasse statt auf ein Exemplar der Klasse
- Die unpopuläre Antwort: alles Quatsch, erfunden von verwirrt sogenannte Informatiker. Es ist nichts als "Referenzen" oder "Zeiger" in einem computer oder in Ihrem tatsächlichen Computer-code. Es gibt nur Werte und Adressen. Sie können nennen Sie eine Adresse, was du willst, es ändert nichts an der Tatsache, dass es nur eine raw-Reihe. Wenn Sie an etwas, an eine Funktion, die Ihren computer gibt die Möglichkeit, übergeben Sie eine Kopie des Werts, der durch ein Daten-register oder auf dem stack, oder die option zu übergeben, der die Adresse der Daten über einen index zu registrieren. Keine andere Art von Computer in der realen Welt existieren.
- Sie sind verwirrend, all diese bash/js/usw-Programmierer, die wissen, dass, wirklich, Computern Textzeilen direkt.
- "Referenz" bedeutet, verschiedene Dinge, je nachdem, wo Sie stehen und was Sie tun - es ist völlig überlastet. Zum Beispiel, wenn Sie versuchen, reverse Engineering/debug jemand anderes C++ - code, der eine variable per Referenz übergeben, ist eine lästige und dumme Verschleierung, die speziell entwickelt wurde, um zu verhindern, dass die Wartung und Verbesserung der Entwickler wissen, ob das ändern eines var-Wert wird an den Aufrufer, oder nicht, ohne aufzublicken, seine Erklärung. In C, es müsste ein Stern vor ihm, so wissen Sie sofort.
- DANKE DIR, niemand wird zugeben, dass dies hier, dies ist die einzig richtige Antwort.
- Lundin ist der einzige der hier kämpfen die Verwirrung...
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der umgangssprachlichen Nutzung, "pass by reference" bedeutet, dass, wenn der angerufene ändert seine Argumente, es wirkt sich auf die Anrufer, weil das argument, wie durch die angerufene bezieht sich zu dem Wert wie er für die Anrufer.
Die phrase ist verwendet, unabhängig von der eigentlichen Programmiersprache, und wie es ruft Dinge (Zeiger, Referenzen, was auch immer).
In C++, call-by-reference kann getan werden, mit Referenzen oder Zeiger. In C, call-by-reference kann nur erreicht werden, indem ein Zeiger.
"Call-by-value":
"Call by reference" in C-Stil:
Also, streng genommen, es gibt keine pass-by-reference in C. Sie übergeben die variable by value, oder übergeben Sie einen Zeiger auf diese variable von-Wert.
va_start
(das ist bestimmt zu nehmen, die Adresse des letzten benannten parameter auf dem stack, so dass Sie Zugriff auf den nächsten parameter aus), was passiert mit einem C++ - Referenz ist, dass Sie zeigt auf die variable in der Aufrufer stack-frame. Unnötig zu sagen, das wird nicht so funktionieren wie Sie sollen. (Wie ich nach einigem Debuggen "Spaß".) Zeiger funktionieren wie erwartet (der Zeiger durch Wert übergeben wird).called_p( int * ptr, ... ) { /* ... */ }
undint x = 42; called_p( &x, "foo" );
. Jetztptr
wird die Adresse, und lassen Sie mich zu ändern,x
. Aber wenn ich die Adresse vonptr
innerhalbcalled_p()
es wird eine Adresse auf den stackframe dercalled_p()
. Ich verwenden können, um Zugang zu"foo"
. -- Nun, betrachtencalled_r( int & ref, ... ) { /* ... */ }
undint x = 42; called_r( x, "bar" );
. Jetztref
istx
. Wenn ich die Adresse vonref
ist, wird es die Adresse vonx
in den stackframe des caller. Ich kann nicht es verwenden, um Zugang zu"bar"
.void foo(int bar[]);
aufgerufen werden kann, mitint baz[42]; foo(baz);
, und der Anrufer sehen die geänderten array-Inhalte. Technisch ist die Funktion-argument Verfall in einen Zeiger, der sowohl in der Funktion, die Unterschrift und den Aufruf, es ist also technisch wird ein Zeiger übergeben durch Wert, aber der sichtbare Effekt ist, dass der ein array übergeben nach Verweis.sizeof
ein array in der Funktion..., weil es einen Zeiger als Wert übergeben. 😉Gibt es keine Referenz Variablen. Aber Sie beziehen sich auf Objekte mit Zeigern. Deshalb werden Zeiger "Referenzen" aus einer abstrakten Sicht.
Du kann nennen es übergeben, indem Zeiger. Referenz ist ein allgemeinerer Begriff als Zeiger. Es ist oft vorzuziehen, die mehr Allgemeine Bezeichnung, wenn Sie wollen, um zu diskutieren, Abstraktionen und ignorieren wollen, die Umsetzung details. Würden Sie das nennen übergabe per Referenz aus dem gleichen Grund, den Sie nennen eine variable "integer" anstatt "int32_t".
Hängt vom Kontext ab. Oft bedeutet es, dass die Funktion-argument ist eine Referenz-variable, Sie kann aber auch beziehen sich auf einen Zeiger, der iterator eine Referenz-wrapper... alles, was referes zu einem Objekt.
Referenz ist ein abstraktes Konzept, das existiert über c und c++; auch jenseits der Programmierung. In c++ wird der Begriff mehrdeutig ist mit Referenz-Variablen und der Kontext und die Konvention (die nicht universal) bestimmt die Bedeutung.
In C, gibt es keine Referenz-Variablen, aber Sie können pass by reference mit Zeigern.
In der wikipedia gibt diese definition.
Im call-by-reference-evaluation (auch bekannt als pass-by-reference), eine Funktion erhält eine implizite Referenz auf eine variable als argument, eher als eine Kopie von seinem Wert. So wird dieser Begriff für die Art der Parameterübergabe wie bereits erwähnt von Thomas. Also ja, seit C ist älter als C++, auch diese Idee ist älter als C++.
Jedoch in C++ beide Zeiger und Referenzen können verwendet werden für die übergabe an die Funktion(Call-by-Adresse und call-by-reference). Tatsächlich sind Sie bei der Arbeit die gleiche Weise, Sie haben nur wenige Unterschiede.
einem anderen Objekt; Sie werden nicht umgesetzt. Dies geschieht oft mit
Zeiger.
dass Sie nicht auf eine gültige Sache.
Einschränkung bei Zeigern
Diese Unterschiede, wenn Sie call-by-reference statt call-by-pointer, Sie können reduzieren die Möglichkeit von NULL-pointer-Fehler Art von Problemen.
Lassen Sie uns klar Ihre Verwirrung.
Weil jedes argument übergeben in C ist pass-by-value. Auch ein pointer-argument ist eine Kopie. Aber es enthält (oder die Punkte,, wenn Sie bevorzugen) den gleichen Wert - memory-Adresse. So ändern Sie die variable Punkte, aber nicht den Zeiger selbst. Da es eine Kopie, was Sie tun, wird nicht auf den Zeiger auf der Anrufer-Ebene.
Es bedeutet, dass das argument ist ein alias für eine variable, die auf der Anrufer-Ebene, nicht auf eine Kopie, die es uns ermöglicht, es zu ändern.
Hoffe, das hat geholfen.
Einen Verweis im Allgemeinen ist eine Instanz, die auf etwas anderes. So ist in einem weiteren Sinn auch ein Zeiger sein kann als eine mögliche Umsetzung eine Referenz. Referenzen in C++ sind nur Referenzen genannt, denn abgesehen von verweisen auf etwas, was Sie bieten keine der anderen Funktionen.
Pass-by-reference verwendet wird, im Allgemeinen zu unterscheiden von pass-by-value. Ob es über Zeiger oder durch eine Referenz ist oft nur ein kleines detail. Aber mit C++ - Referenzen ist es imho mehr klar, was ist der Zweck der parameter der Funktion. Eg:
auf der anderen Seite, mit verweisen ist (im Gegensatz zu Zeigern) es ist nicht so offensichtlich auf den Ruf Website, wenn es ist pass-by-value und pass-by-reference. E. g.
Stellen Sie sich vor Sie haben, um Ihr Haus malen...
by value:
Sie bringen eine Kopie von Ihrem Haus zu der Maler=>
viel Aufwand (vielleicht auf Schienen)by reference:
geben Sie Ihre Haus-Adresse, an die Maler, so kann er kommen und malen es"Pass by reference" (oder "call-by-reference") ist ein Begriff für eine Art der Parameterübergabe beim Aufruf einer Funktion, und die Idee ist älter als C++. Es muss nicht unbedingt durchgeführt werden müssen, um mit C++ "Referenzen". C nicht über einen eingebauten Mechanismus, um dies zu tun, so müssen Sie Zeiger verwenden.
Nur um die Antworten, die Referenzierung bedeutet nicht, dass der Verweis-Adresse. Der compiler kann eine Methode, um einen Verweis auf eine variable.
wenn Sie passieren etwas durch Verweis mit dem Sie arbeiten, die Adresse und nicht der Wert einer variable direkt, Wenn Sie einen Referenz-parameter, Sie sind immer die Adresse der Variablen übergeben.
Von dort aus können Sie es verändern, wie immer Sie wollen, als die variable, die Sie übergeben, WIRD sich ändern, wenn Sie ändern Sie den Verweis in der Funktion. Es ist ein einfacher Weg, um die Arbeit mit großen Mengen von Daten, die es wirklich nur speichert auf memory etc..
In C gibt es zwei Konzepte
1. Call-by-value - Hier kopieren von Werten übergeben werden, so dass die tatsächlichen Werte nicht ändern wird außerhalb der Funktion.
2. Call-by-reference - aber hier die tatsächlichen Werte (Adresse des tatsächlichen Operanden) übergeben werden, so wird es ändern Sie die Werte weltweit.
, Wo in C++ gibt es zwei Konzepte
1. Als Wert übergeben - es ist dasselbe wie c, tatsächlicher Wert nicht ändern, Geltungsbereich diese Werte werden von der Funktion nur.
2. Übergabe per Referenz - die tatsächlichen Werte (Adresse des tatsächlichen Operanden) übergeben werden, so wird es ändern Sie die Werte Global, das bedeutet, wenn Werte verändert wird, dann wird es auch Auswirkungen auf die im gesamten Programm.
In Verweis Übergeben, die Adresse des Operanden übergeben werden, dass ist, warum es wird genannt als Verweis Übergeben, nicht als Zeiger.