Forum: PC-Programmierung C - ByVal, ByRef


von Roth (Gast)


Lesenswert?

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

von TriHexagon (Gast)


Lesenswert?

Bei C ja, bei C++ durch echte Referenzen nein.

Roth schrieb:
> C/C++

Sollte man nie in einen Topf werfen.

von Roth (Gast)


Lesenswert?

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?

von TriHexagon (Gast)


Lesenswert?

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.

von Roth (Gast)


Lesenswert?

Alles klar :-)

Besten dank an alle.

von Hans-Georg L. (h-g-l)


Lesenswert?

TriHexagon schrieb:
> Bei C ja, bei C++ durch echte Referenzen nein.

Ausser arrays, die werden immer ByRef übergeben.

von Rolf M. (rmagnus)


Lesenswert?

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])

von AbcAbc (Gast)


Lesenswert?

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

von Hans-Georg L. (h-g-l)


Lesenswert?

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.

von Jemand (Gast)


Lesenswert?

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.

von Hans-Georg L. (h-g-l)


Lesenswert?

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.

von Hans-Georg L. (h-g-l)


Lesenswert?

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
von Jemand (Gast)


Lesenswert?

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?

von Hans-Georg L. (h-g-l)


Lesenswert?

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.

von Jemand (Gast)


Lesenswert?

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.

von Hans-Georg L. (h-g-l)


Lesenswert?

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 ;-)

von Rolf M. (rmagnus)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

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)

von Marie (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.