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
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.
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:
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
>voidmyfunc(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.
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.