Kurze Frage. Funktionsparameter sind bei C/C++ immer By Value, oder? Ich gehe davon aus, dass ByRef Parameter als Zeiger übergeben werden müssen, stimmts? Schlüsselworte a'la ByRef / ByVal sind mir nämlich nicht in Erinnerung. Google warf da auch nichts aus
Bei C ja, bei C++ durch echte Referenzen nein. Roth schrieb: > C/C++ Sollte man nie in einen Topf werfen.
TriHexagon schrieb: > Sollte man nie in einen Topf werfen. Hab mit C/C++ nicht viel zu tun, wie man bestimmt merkt. Ich dachte aber, dass C++ zu C abwärtskompatibel ist, was den Basisbefehlssatz betrifft. > Bei C ja, bei C++ durch echte Referenzen nein. Was ist mit echten Referenzen gemeint?
Roth schrieb: > TriHexagon schrieb: >> Sollte man nie in einen Topf werfen. > Hab mit C/C++ nicht viel zu tun, wie man bestimmt merkt. Ich dachte > aber, dass C++ zu C abwärtskompatibel ist, was den Basisbefehlssatz > betrifft. Theoretisch ja, praktisch scheitert die Abwärtskompatibilität an der strengen Typisierung von C++. An C-Code mit dutzend unnötigen Casts sieht man, dass der Schreiberling einen C++-Compiler verwendet hat. Aber davon abgesehen, macht man in C++ sehr vieles anders bzw. besser (dank der zusätzlichen Möglichkeiten in C++). Roth schrieb: >> Bei C ja, bei C++ durch echte Referenzen nein. > Was ist mit echten Referenzen gemeint? Na Referenzen eben. http://kurse.eichelsdoerfer.net/c_cpp/p0104.html Echtes CallByRef ist in C nicht möglich, aber in C++. In C nimmt man dafür den Workaround über einen Zeiger.
TriHexagon schrieb: > Bei C ja, bei C++ durch echte Referenzen nein. Ausser arrays, die werden immer ByRef übergeben.
Hans-Georg L. schrieb: > TriHexagon schrieb: >> Bei C ja, bei C++ durch echte Referenzen nein. > > Ausser arrays, die werden immer ByRef übergeben. Nein. Da wird in C auch nur ein Zeiger auf das erste Element draus. In C++ kann man aber auch Referenzen auf Arrays machen:
1 | void myfunc(int (&arg)[10]) |
Man sollte noch anmerken, dass auch ein C Compiler den eigentlichen Zugriff auf den Speicher so optimieren kann, als ob man eine Referenz verwendet hat. Er muss also nicht zwangläufig die Kopie eines Pointers übergeben im resultierenden Binärcode
Rolf M. schrieb: > Hans-Georg L. schrieb: >> TriHexagon schrieb: >>> Bei C ja, bei C++ durch echte Referenzen nein. >> >> Ausser arrays, die werden immer ByRef übergeben. > > Nein. Da wird in C auch nur ein Zeiger auf das erste Element draus. > In C++ kann man aber auch Referenzen auf Arrays machen: > >
1 | > void myfunc(int (&arg)[10]) |
2 | >
|
Und was ist denn ein Zeiger ? eine Referenz. Wäre es byValue müsste das Array auf den Stack kopiert werden. Wie z.b. bei Strukturen.
Hans-Georg L. schrieb: > Und was ist denn ein Zeiger ? eine Referenz. Wäre es byValue müsste das > Array auf den Stack kopiert werden. Wie z.b. bei Strukturen. Wenn du das Übergeben von Pointern "pass by reference" nennst, provoziert das nur Missverständnisse. Die beiden Fälle müssen zwingend unterschieden werden, da sie sich unterschiedlich verhalten.
AbcAbc schrieb: > Man sollte noch anmerken, dass auch ein C Compiler den eigentlichen > Zugriff auf den Speicher so optimieren kann, als ob man eine Referenz > verwendet hat. > Er muss also nicht zwangläufig die Kopie eines Pointers übergeben im > resultierenden Binärcode Das ist richtig aber bei der Parameterübergabe muss er sich an seine eigenen Regeln halten. Übergabe in welchen Registern und/oder auf dem Stack. Während der Laufzeit gibt es kein C und kein C++ mehr. Beispiel: Der MS Comiler für 64bit verwendet __fastcall und das bedeutet das die ersten 4 Parameter soweit sie in 64 bit passen über die Register RCX,RDX,R8,R9 und alle weiteren über den Stack übergeben werden. Der GNU Compiler hat auch seine Regeln zur Parameterübergabe.
Jemand schrieb: > Hans-Georg L. schrieb: >> Und was ist denn ein Zeiger ? eine Referenz. Wäre es byValue müsste das >> Array auf den Stack kopiert werden. Wie z.b. bei Strukturen. > > Wenn du das Übergeben von Pointern "pass by reference" nennst, > provoziert das nur Missverständnisse. Die beiden Fälle müssen zwingend > unterschieden werden, da sie sich unterschiedlich verhalten. Wir reden von C und nicht C++ Arrays sind keine Kopien und du kannst das Array über den Zeiger überschreiben. Ein Value ist eine Kopie.
:
Bearbeitet durch User
Hans-Georg L. schrieb: > Arrays sind keine Kopien und du kannst das Array über den Zeiger > überschreiben. Ein Value ist eine Kopie. Kindergarten. Hans-Georg L. schrieb: > Wir reden von C und nicht C++ Wenn ich eine solche C-Funktion in C++ verwende, ist es dann plötzlich kein "pass by reference" mehr?
Jemand schrieb: > Hans-Georg L. schrieb: >> Arrays sind keine Kopien und du kannst das Array über den Zeiger >> überschreiben. Ein Value ist eine Kopie. > > Kindergarten. > > Hans-Georg L. schrieb: >> Wir reden von C und nicht C++ > > Wenn ich eine solche C-Funktion in C++ verwende, ist es dann plötzlich > kein "pass by reference" mehr? Wer hat den das behauptet ? Es geht um Arrays und die werden auch in C++ als Zeiger übergeben.
Hans-Georg L. schrieb: > Jemand schrieb: > Hans-Georg L. schrieb: > Arrays sind keine Kopien und du kannst das Array über den Zeiger > überschreiben. Ein Value ist eine Kopie. > > Kindergarten. > Hans-Georg L. schrieb: > Wir reden von C und nicht C++ > > Wenn ich eine solche C-Funktion in C++ verwende, ist es dann plötzlich > kein "pass by reference" mehr? > > Wer hat den das behauptet ? Es geht um Arrays und die werden auch in > C++ als Zeiger übergeben. Es geht um die Unterscheidung von "pass by pointer", bei der ein Pointer "by value" übergeben wird, und "pass by reference", was es in C nicht gibt.
Roth schrieb: > Kurze Frage. Funktionsparameter sind bei C/C++ immer By Value, oder? TriHexagon schrieb: > Bei C ja, bei C++ durch echte Referenzen nein. Darauf meine Antwort das das auf Arrays nicht zutrifft, die werden niemals per Value übergeben weder bei C noch bei C++ da gibt es keinen Unterschied. .... Ich entschuldige mich ausdrücklich bei allen "Sprach-Schützern" weil ich nicht überall von "C-Zeigern" und "echten C++ Referenzen" gesprochen habe. Ich hatte einfach vergessen das "Referenz" eine neue Erfindung von C++ ist, vorher niemals verwendet wurde und Urherberrechtlich geschützt ist ;-)
Hans-Georg L. schrieb: > Ich entschuldige mich ausdrücklich bei allen "Sprach-Schützern" weil ich > nicht überall von "C-Zeigern" und "echten C++ Referenzen" gesprochen > habe. Ich hatte einfach vergessen das "Referenz" eine neue Erfindung von > C++ ist, vorher niemals verwendet wurde und Urherberrechtlich geschützt > ist ;-) Du hast offenbar den Grund noch nicht ganz verstanden, warum hier auf der Unterscheidung zwischen Zeigern und Referenzen bestanden wird. Das hat nichts mit "Sprach-Schützern" zu tun, sondern damit, dass das für das Verständnis wichtig ist. Die typische Frage "warum gibt sizeof für mein Array immer eine Größe von 4 zurück?", die ich schon bestimmt 100 mal in Foren und Newsgroups gelesen habe (und die gerade wieder in einem Nachbarthread diskutiert wird), resultiert gerade daraus, dass nicht verstanden wird, dass in der Funktion keine Referenz auf ein Array, sondern lediglich ein Zeiger auf dessen erstes Element ankommt.
Und wenn man einen Speicherbereich (hinter dem z.B. ein Array stehen könnte) by value übergeben will, bekommt man sowas Ähnliches etwa so hin:
1 | void my_func(const t_foo *ptr) |
Nop schrieb: > by value übergeben will, bekommt man sowas Ähnliches etwa so > hin: > void my_func(const t_foo *ptr) Nein?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.