call by value/reference und über referenzen
-
Hallo zusammen,
ich arbeite mich gerade etwas durch die "call by's" durch und habe diese soweit sehr gut verstanden. Allerdings häte ich eine Frage zu folgendem Beispiel in dem ich Werte tausche.
#include <iostream> using namespace std; void my_swap_value(int p1, int p2); //call by Value void my_swap(int *p1, int *p2); //call by reference void my_swap_ref(int &p1, int &p2); //call by reference mit Referenzen int main (void) { int a = 1, b = 2; cout << "a alt: " << a << endl; cout << "b alt: " << b << endl; my_swap_value(a, b); //call by Value my_swap(&a, &b); //call by reference my_swap_ref(a, b); //call by reference mit Referenzen cout << "a nach funk: " << a << endl; // wuden getauschte Werte übergeben oder global geänder? cout << "b nach funk: " << b << endl; } void my_swap_value(int p1, int p2) //call by Value { int temp; temp = p1; p1 = p2; p2 = temp; cout << "p1=a in value_funk: " << p1 << endl; cout << "p2=b in value_funk: " << p2 << endl; } void my_swap(int *p1, int *p2) //call by reference { int *temp; temp = p1; p1 = p2; p2 = temp; cout << "p1=a in funk: " << *p1 << endl; cout << "p2=b in funk: " << *p2 << endl; } void my_swap_ref(int &p1, int &p2) //call by reference mit Referenz { int temp; temp = p1; p1 = p2; p2 = temp; cout << "p1=a in Ref_funk: " << p1 << endl; cout << "p2=b in Ref_funk: " << p2 << endl; }Hier teste ich jeweils die Aufrufe und kommentiere die call by funktionen aus um zu schauen ob die Aufrufe Auswirkungen auf die Main-Funktion haben.
-Mit call by value werden die Werte in der Main nicht geändert, das war mir klar, da ja auch keine Rückgabewerte gegben sind und ich nicht mit Adressen arbeite.
-Aber Nun die Frage, warum ändert meine call by rferenz nicht die Werte in der Main, da ich doch die Adressen vertausche? Bzw. wie könnte ich in die Funktion
void my_swap(int *p1, int *p2) umbauen das die Werte in der MAin geändert werden?- und ganz komisch finde ich ja das Arbeiten mit Referenzen (war imemr der c Benutzer). Ich lege ja hier einen Alias (kopie) an. Warum ändert diese nun den Wert in der Main-Funktion. Liegt dies daran, dass hier in 52 &p1 die Adrese übergeben wird und sich das in Main auswirkt?
Eventuell kann mir jm. hier ein wenig klarheit verschaffen, ich habe zwar ein Buch, da ist dies aber nur dürftig erklärt.
Herzlichen Dank Frederik
-
void my_swap(int *p1, int *p2) //call by reference { int temp; temp = *p1; *p1 = *p2; *p2 = temp; cout << "p1=a in funk: " << *p1 << endl; cout << "p2=b in funk: " << *p2 << endl; }
-
Frederik schrieb:
Aber Nun die Frage, warum ändert meine call by rferenz nicht die Werte in der Main, da ich doch die Adressen vertausche?
Das eine hat doch mit dem anderen nichts zu tun. In Deiner
swap-Funktion gibt es lokale Variablen, die die Adressen speichern. Du vertauscht nur das, was diese lokalen Variablen speichern. Sonst nichts.Frederik schrieb:
und ganz komisch finde ich ja das Arbeiten mit Referenzen (war imemr der c Benutzer). Ich lege ja hier einen Alias (kopie) an.
Nein. Das ist keine Kopie! Es ist nur ein neuer Name, der sich auf dieselbe Speicherstelle bezieht!
-
kkaw schrieb:
Nein. Das ist keine Kopie! Es ist nur ein neuer Name, der sich auf dieselbe Speicherstelle bezieht!
Ach so deswegen wirkt sich das direkt auf die Main aus.
Belli schrieb:
int temp; temp = *p1; *p1 = *p2; *p2 = temp;Uh vielen Dank ich muss hier mit den *p1 u. *p2 arbeiten. Das erscheint mir logisch.
Entschuldigt die für euch banalen Fragen, dennoch vielen Dank!