& im Funktionskopf
-
Hi...
int test(int *a) {...} int b = 5; test(&b);
Das ist klar (Pointer), aber wofür steht das hier:
int test(int &a) {...} int b = 5; test(b);
Oder geht das nur bei Strukturen?
Wenn ja oder nein: Was bringt das denn? ^^'
-
Der zweite Fall wäre eine Rezerenz. Die gibts aber nur in C++, nicht in C.
-
Das heißt also, dass beim Aufrufen der Funktion keine Kopie erzeugt, sondern auf die ursprüngliche Variable zugegriffen wird?
Wenn dies der Fall ist, wären die beiden Code-Schnipsel denn dann nicht nahezu gleich?
Ob nun Zeiger oder Referenz, es kommt auf das gleiche hinaus?
-
Ja, allerdings sind Referenzen leichter zu handhaben (eben wie normale Variablen).
-
Ok, danke, also heißt das, dass ich wenn schon Pointer benutzen müsste..
Aber was verbraucht eigentlich mehr Speicher:int test(int b) { return b: } int main() { int a = 5; test(a); return 0; }
int test(int *b) { return *b: } int main() { int a = 5; test(&a); return 0; }
2 ints
oder
1 int und 1 Zeiger?
-
Abgesehn davon das die Beispiele keinen Sinn machen verbrauchen
bei einem int normalerweise alle Varianten gleich viel.
Also Call-by-Value verbraucht 1 int, und Call-by-Reference 1 Zeiger der
meist genauso groß ist wie ein int (Referenzen selbst sind intern als Zeiger
dargestellt).
Bei der Pointer/Referenz-Variante kannst du dir allerdings den Rückgabewert sparen
-
äähhhö schrieb:
Ob nun Zeiger oder Referenz, es kommt auf das gleiche hinaus?
nein. Du kannst dasselbe erzielen, aber das heißt nicht, dass der Code "äquivalent" wird oder so. Betrachte folgenden Code:
/* C Variante mit Zeigern */ #include <stdio.h> int compute_somthing(int ptr) { return ptr + 13; } void foo(int *ptr) { int z; *ptr = 8; z = 10; /* ab jetzt brauche ich change_me nicht mehr zu verändern */ ptr = &z; *ptr *= compute_somthing(*ptr); } int main(void) { int change_me; foo(&change_me); printf("C: change_me = %d\n", change_me); return 0; }
und jetzt dasselbe aber mit Referenzen
// C++ Variante mit Referenzen #include <iostream> int compute_somthing(int ptr) { return ptr + 13; } void foo(int &ptr) { int z; ptr = 8; z = 10; /* ab jetzt brauche ich change_me nicht mehr zu verändern */ ptr = z; ptr *= compute_somthing(ptr); } int main(void) { int change_me; foo(change_me); std::cout << "C++: change_me = " << change_me << std::endl; return 0; }
Die Ausgabe:
C: change_me = 8 C++: change_me = 230
Beim C Programm hat change_me den Wert 8 (nach dem Aufruf von foo). 'ptr' zeigt irgendwann auf eine andere Stelle und change_me "merkt" das nicht. Wären das alle C++ Referenzen (wie im C++ Code), dann wäre das nicht möglich.