mikrocontroller.net

Forum: PC-Programmierung C - ByVal, ByRef


Autor: Roth (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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

Autor: TriHexagon (Gast)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Bei C ja, bei C++ durch echte Referenzen nein.

Roth schrieb:
> C/C++

Sollte man nie in einen Topf werfen.

Autor: Roth (Gast)
Datum:

Bewertung
-2 lesenswert
nicht 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?

Autor: TriHexagon (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Roth (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar :-)

Besten dank an alle.

Autor: Hans-Georg L. (h-g-l)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TriHexagon schrieb:
> Bei C ja, bei C++ durch echte Referenzen nein.

Ausser arrays, die werden immer ByRef übergeben.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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:
void myfunc(int (&arg)[10])

Autor: AbcAbc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans-Georg L. (h-g-l)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>
> void myfunc(int (&arg)[10])
> 

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.

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans-Georg L. (h-g-l)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans-Georg L. (h-g-l)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hans-Georg L. (h-g-l)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans-Georg L. (h-g-l)
Datum:

Bewertung
-1 lesenswert
nicht 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 ;-)

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void my_func(const t_foo *ptr)

Autor: Marie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nop schrieb:
> by value übergeben will, bekommt man sowas Ähnliches etwa so
> hin:
> void my_func(const t_foo *ptr)

Nein?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.