Bedeutung von Pass by Reference in C und C ++?

7

Ich bin verwirrt über die Bedeutung von "pass by reference" in C und C ++.

In C gibt es keine Referenzen. Ich denke also, dass "pass by reference" heißt, einen Zeiger zu übergeben. Aber warum sollte man es dann nicht Zeiger für Zeiger nennen?

In C ++ haben wir Zeiger und Referenzen (und ähnliche Dinge wie Iteratoren). Also was bedeutet Verweis hier?

    
Registered User 10.05.2016, 10:58
quelle

10 Antworten

14

In der umgangssprachlichen Verwendung bedeutet "pass by reference", dass der Aufrufer, wenn er seine Argumente ändert, den Aufrufer beeinflusst, weil das Argument, wie es von dem aufgerufenen angezeigt wird, auf den Wert verweist Anrufer.

Die Phrase wird unabhängig von der eigentlichen Programmiersprache verwendet und wie sie Dinge (Zeiger, Referenzen, was auch immer) nennt.

In C ++ kann call-by-reference mit Referenzen oder -Zeigern erfolgen. In C kann call-by-reference nur durch Übergeben eines Zeigers erreicht werden.

"Aufruf nach Wert":

%Vor%

"Aufruf über Referenz", C style:

%Vor%

Streng genommen gibt es also in kein Pass-by-Reference in C . Entweder übergeben Sie die Variable by-value, oder Sie übergeben einen Zeiger auf diese Variable by-value .

    
DevSolar 10.05.2016, 11:10
quelle
5
  

In C gibt es keine Referenzen

Es gibt keine Referenz Variablen . Aber Sie können mit Zeigern auf Objekte verweisen. Daher sind Zeiger "Referenzen" aus einer abstrakten Sicht.

  

Aber warum nennt man es nicht Zeiger für Zeiger?

Sie können es aufrufen übergeben durch Zeiger . Referenz ist ein allgemeinerer Begriff als Zeiger. Es ist oft vorzuziehen, den allgemeineren Begriff zu verwenden, wenn Sie Abstraktionen diskutieren und Implementierungsdetails ignorieren möchten. Sie würden es als Verweis übergeben, aus dem gleichen Grund, weil Sie eine Variable "integer" anstelle von "int32_t" aufrufen.

  

In C ++ haben wir Zeiger und Referenzen (und ähnliche Dinge wie Iteratoren). Also was bedeutet Verweis hier?

Hängt vom Kontext ab. Oft bedeutet dies, dass das Funktionsargument eine Referenzvariable ist, aber es kann sich auch auf einen Zeiger, einen Iterator, einen Referenzwrapper beziehen ... alles, was sich auf ein Objekt bezieht.

Reference ist ein abstraktes Konzept, das jenseits von c und c ++ existiert; sogar über das Programmieren hinaus . In c ++ ist der Begriff mit Referenzvariablen mehrdeutig und der Kontext und die Konvention (die nicht universell ist) bestimmen die Bedeutung.

    
user2079303 10.05.2016 11:10
quelle
3

In C gibt es keine Referenzvariablen, aber Sie können als Verweis mit Hilfe von Zeigern übergeben werden.

In Wikipedia gibt es diese Definition. Bei der Aufruf-durch-Referenz-Auswertung (auch als "Pass-by-Reference" bezeichnet) erhält eine Funktion eine implizite Referenz auf eine Variable, die als Argument verwendet wird, und nicht auf eine Kopie ihres Wertes. Dieser Begriff bezieht sich also auf die Art der Parameterübergabe wie von Thomas erwähnt. Also ja, da C älter als C ++ ist, ist auch diese Idee älter als C ++.

In C ++ können jedoch sowohl Zeiger als auch Referenzen für die Übergabe an die Funktion verwendet werden (Call by address und call by reference). Eigentlich arbeiten sie genauso, sie haben nur wenige Unterschiede.

  • Sobald eine Referenz erstellt wurde, kann sie später nicht mehr referenziert werden ein anderes Objekt; Es kann nicht erneut festgelegt werden. Dies geschieht oft mit Zeiger.
  • Referenzen können nicht NULL sein. Pointer werden oft mit NULL gekennzeichnet dass sie nicht auf irgendeine gültige Sache zeigen.
  • Eine Referenz muss bei der Deklaration initialisiert werden. Es gibt keinen solchen Einschränkung mit Zeigern

Mit diesen Unterschieden können Sie, wenn Sie call by reference statt call by pointer verwenden, die Möglichkeit eines NULL-Pointer-Fehlers reduzieren.

    
Prometheus 10.05.2016 11:25
quelle
2

Lass uns deine Verwirrung klären.

  

In C gibt es keine Referenzen. Ich denke also, dass "pass by reference" bedeutet, einen Zeiger zu übergeben. Aber warum sollte man es dann nicht Zeiger für Zeiger nennen?

Weil jedes in C übergebene Argument pass-by-value ist. Auch ein Zeigerargument ist eine Kopie. Aber es enthält (oder zeigt auf, wenn Sie bevorzugen) den gleichen Wert - Speicheradresse. Auf diese Weise können Sie die Variable ändern, auf die sie zeigt, nicht aber den Zeiger selbst. Da es sich um eine Kopie handelt, wirkt sich alles, was Sie tun, nicht auf den Zeiger auf der Aufrufebene aus.

  

In C ++ haben wir Zeiger und Referenzen (und ähnliche Dinge wie Iteratoren). Also was bedeutet Verweis hier?

Das bedeutet, dass das Argument ein Alias ​​einer Variable auf der Aufrufebene ist, keine Kopie, die es uns erlaubt, sie zu ändern.

Hoffnung, die geholfen hat.

    
HighPredator 10.05.2016 11:49
quelle
1

Eine Referenz im Allgemeinen ist eine Instanz, die auf etwas anderes verweist. In einem weiteren Sinne kann also auch ein Zeiger als eine mögliche Implementierung einer Referenz betrachtet werden. Referenzen in C ++ werden nur als Referenzen bezeichnet, da sie abgesehen von der Referenzierung keine anderen Funktionen bieten.

"Pass-by-Reference" wird im Allgemeinen verwendet, um von "pass-by-value" zu unterscheiden. Ob per Zeiger oder über eine Referenz ist oft nur ein kleines Detail. Mit C ++ - Referenzen wird jedoch deutlicher, was der Funktionsparameter ist. ZB:

%Vor%

andererseits, mit Referenzen (im Vergleich zu Zeigern) ist es nicht so offensichtlich auf der Aufrufseite, wenn es Pass-by-Value oder Pass-by-Reference ist. ZB

%Vor%     
user463035818 10.05.2016 11:07
quelle
1

Stellen Sie sich vor, Sie müssten Ihr Haus streichen ...

by value: bring eine Kopie deines Hauses zum Maler => viel Aufwand (vielleicht auf Schienen)
by reference: du gibst deinem Maler deine Hausadresse, damit er kommen und malen kann

    
V. Sambor 10.05.2016 11:16
quelle
1

"" Pass by reference "" (oder "call by reference") ist ein Begriff für einen Parametertyp Übergabe beim Aufruf einer Funktion, und die Idee ist älter als C ++. Es muss nicht unbedingt mit C ++ " Referenzen geschehen". C verfügt nicht über einen eingebauten Mechanismus, so dass Sie Zeiger verwenden müssen.

    
Thomas Padron-McCarthy 10.05.2016 11:07
quelle
0

Um nur zu den Antworten hinzuzufügen, bedeutet Referenzieren nicht Referenzieren nach Adresse. Der Compiler kann eine beliebige Methode verwenden, um auf eine Variable zu verweisen.

    
Souradeep Basu 11.05.2016 03:54
quelle
-1

Wenn Sie etwas als Referenz übergeben, arbeiten Sie direkt mit der Adresse und nicht direkt mit dem Wert einer Variablen. Wenn Sie einen Referenzparameter verwenden, erhalten Sie die Adresse der Variablen, die Sie übergeben.

Von dort können Sie es wie gewünscht manipulieren, da die Variable, die Sie übergeben haben, sich ändert, wenn Sie die Referenz in der Funktion ändern. Es ist eine einfachere Art, mit großen Datenmengen zu arbeiten, es spart nur Speicher usw. ..

    
Afflicted 10.05.2016 11:13
quelle
-2

In C gibt es zwei Konzepte  

1. Call by value - Hier wird eine Kopie der Werte übergeben, so dass sich die tatsächlichen Werte nicht außerhalb der Funktion ändern.

2. Aufruf als Referenz - aber hier werden die tatsächlichen Werte (Adresse der tatsächlichen Operanden) übergeben, so dass die Werte global geändert werden.

Wo in C ++ gibt es zwei Konzepte

1. Nach Wert übergeben - es ist gleich wie c, die tatsächlichen Werte ändern sich nicht, der Gültigkeitsbereich dieser Werte ist nur von der Funktion.

2. Pass by Reference - tatsächliche Werte (Adresse der tatsächlichen Operanden) werden übergeben, so dass die Werte global geändert werden, dh wenn Werte geändert werden, wirkt sich dies auf das gesamte Programm aus.

In Pass by Reference wird die Operandenadresse übergeben, weshalb sie als Pass By Reference nicht als Zeiger bezeichnet wird.

    
Jay Patel 10.05.2016 11:17
quelle

Tags und Links