C++
C ++ - Funktion "Aufruf durch Wert" vs. "Aufruf durch Referenz"
Suche…
Einführung
In diesem Abschnitt werden die Unterschiede in Theorie und Implementierung erläutert, was mit den Parametern einer Funktion beim Aufruf geschieht.
Im Detail können die Parameter als Variablen vor dem Funktionsaufruf und innerhalb der Funktion betrachtet werden, wobei das sichtbare Verhalten und der Zugriff auf diese Variablen sich bei der Übergabemethode unterscheiden.
Darüber hinaus wird die Wiederverwendbarkeit von Variablen und ihrer jeweiligen Werte nach dem Funktionsaufruf ebenfalls in diesem Thema erläutert.
Aufruf nach Wert
Beim Aufruf einer Funktion werden auf dem Programmstapel neue Elemente erstellt. Dazu gehören Informationen zur Funktion sowie Platz (Speicherplätze) für die Parameter und den Rückgabewert.
Bei der Übergabe eines Parameters an eine Funktion wird der Wert der verwendeten Variablen (oder des Literal) in den Speicherplatz des Funktionsparameters kopiert. Dies bedeutet, dass jetzt zwei Speicherplätze mit demselben Wert vorhanden sind. Innerhalb der Funktion arbeiten wir nur am Parameterspeicherort.
Nach dem Verlassen der Funktion wird der Speicher auf dem Programmstack entfernt (entfernt), wodurch alle Daten des Funktionsaufrufs gelöscht werden, einschließlich des Speicherorts der verwendeten Parameter. Die innerhalb der Funktion geänderten Werte wirken sich daher nicht auf die Werte der äußeren Variablen aus.
int func(int f, int b) {
//new variables are created and values from the outside copied
//f has a value of 0
//inner_b has a value of 1
f = 1;
//f has a value of 1
b = 2;
//inner_b has a value of 2
return f+b;
}
int main(void) {
int a = 0;
int b = 1; //outer_b
int c;
c = func(a,b);
//the return value is copied to c
//a has a value of 0
//outer_b has a value of 1 <--- outer_b and inner_b are different variables
//c has a value of 3
}
In diesem Code erstellen wir Variablen innerhalb der Hauptfunktion. Diese erhalten zugewiesene Werte. Beim Aufruf der Funktionen werden zwei neue Variablen erstellt: f
und inner_b
wobei b
den Namen mit der äußeren Variablen teilt, nicht jedoch den Speicherort. Das Verhalten von a<->f
und b<->b
ist identisch.
Die folgende Grafik symbolisiert, was auf dem Stack passiert und warum sich Varibale b
nicht ändert. Die Grafik ist nicht vollständig genau, betont jedoch das Beispiel.
Es wird "Aufruf nach Wert" genannt, da wir nicht die Variablen, sondern nur die Werte dieser Variablen übergeben.