Referenzparameter bei Arrays von Strukturen
-
Mahlzeit,
ich habe eine Frage zu Referenzparametern bei Arrays von Strukturen.
Wenn ich folgenden Code habe:
#include <iostream> using namespace std; struct struktur { int wert; }; void funkt(struct struktur test[1]) { test[0].wert = 1; } int main() { struct struktur test[1]; funkt(&test[0]); cout << test[0].wert; return 0; }
Ist das nun tatsächlich richtiges Call by Reference? Die Ausgabe dieses Codes lautet ja "1", was bei Call by Value ja in diesem Falle nicht möglich wäre...
Und wenn nein, wie muss es umgeschrieben werden, damit ich wirklich die Referenzparameter übergebe?
Vielen Dank im Voraus!
Götz
-
goetz schrieb:
Mahlzeit,
ich habe eine Frage zu Referenzparametern bei Arrays von Strukturen.
Wenn ich folgenden Code habe:
#include <iostream> using namespace std; struct struktur { int wert; }; void funkt(struct struktur test[1]) { test[0].wert = 1; } int main() { struct struktur test[1]; funkt(&test[0]); cout << test[0].wert; return 0; }
Ist das nun tatsächlich richtiges Call by Reference? Die Ausgabe dieses Codes lautet ja "1", was bei Call by Value ja in diesem Falle nicht möglich wäre...
Und wenn nein, wie muss es umgeschrieben werden, damit ich wirklich die Referenzparameter übergebe?
Vielen Dank im Voraus!
Götz
Du übergibts der Funktion einen Zeiger! (funkt(&test[0]);) der so in der Funktion dereferenziert wird (test[0].wert = 1;) inkl. Zuweisung von 1.
Das ist Arbeiten mit Zeigern ! bei Call by Reference muss eine Referenz an die Funktion übergeben werden.
Mahlzeit!
-
In Ordnung... aber wie sieht denn der Code dann aus?
-
goetz schrieb:
In Ordnung... aber wie sieht denn der Code dann aus?
Verweise (Referenzen) auf Arrays sind unzulässig! Deshalb, bleib in diesem Fall beim Arbeiten mit Zeigern - die leisten hier das Gleiche.
#include <iostream> using namespace std; struct struktur { int wert; }; void funkt(struktur* test) { test[0].wert = 1; } int main() { struktur test[1]; funkt(test); cout << test[0].wert; }
mfg
-
Super! Davon ging ich auch aus... danke für diese qualifizierte Antwort.
-
goetz schrieb:
Super! Davon ging ich auch aus... danke für diese qualifizierte Antwort.
Sieht eher recht blamabel aus.
Wahr ist, dass es keine per-Value-Parameterübergabe für Arrays gibt. Eine Deklaration, die formal einer solchen Übergabe entspräche wird durch den Compiler in eine solche transformiert, die einen Zeiger auf die Elemente des Arrays konsumiert. Das hat allerdings wenig mit Übergabe-per-Referenz im Sinne von C++ Referenzen zu tun. Diese Übergabe ist durchaus möglich:#include <iostream> using namespace std; struct struktur { int wert; }; void funkt(struktur (&test)[1]) { test[0].wert = 1; } int main() { struktur test[1]; funkt(test); cout << test[0].wert; }
-
Welche dieser Schreibweisen ist programmiertechnisch denn am meisten zu empfehlen?
Zum Hintergrund meiner Fragestellung: Die Übungsleiter an meiner Uni sind der Auffassung, dass wir grundsätzlich alles mit Referenzparametern übergeben sollen. Bei einer Aufgabe, bei der es (prinzipiell) um den o.g. Fall ging, wusste ich nicht konkret, wie man das umsetzen sollte.
-
goetz schrieb:
Welche dieser Schreibweisen ist programmiertechnisch denn am meisten zu empfehlen?
Zum Hintergrund meiner Fragestellung: Die Übungsleiter an meiner Uni sind der Auffassung, dass wir grundsätzlich alles mit Referenzparametern übergeben sollen. Bei einer Aufgabe, bei der es (prinzipiell) um den o.g. Fall ging, wusste ich nicht konkret, wie man das umsetzen sollte.
Keine. Verzichte auf Pointer und Arrays, solange du kannst. Es gibt schließlich Container.
Die Übergabe per Pointer ist streng genommen eine Übergabe per-Value, die erst auf einer höheren Abstraktionsebene soetwas wie Referenzübergabe darstellt. Umgekehrt ist die Übergabe per Referenz auf ein Array in der Praxis einerseits nicht so verbreitet (indiziert durch obigen Beitrag von Bratwurst
). Zudem muss hier die Dimension beim Compilieren bekannt sein - aber andernfalls hast du es ja auch nicht mit einem echten Array zu tun, und die Frage erübrigt sich. Grundsätzlich per Referenz zu übergeben ist logisch Unsinn (und insofern eine Lüge des Programmierers), aber wohl möglich.
-
Okay, vielen Dank für die Infos.
Mit Container und der STL muss ich mich sowieso noch auseinander setzen... dennoch, vielen Dank