Call by Reference - Allgemein

Gast #5069414
Moin,
ich habe eine Frage zu Zeigern als Parameter einer Funktion. Dabei wird 
statt dem Wert doch die Adresse kopiert oder? Oft wird davon geredet, 
dass die Adresse übergeben wird, aber im Prinzip kopiert man eine 
Adresse auf dem Stack und der Zeiger zeigt darauf. Wie ist es mit 
größeren Strukturen?
Übergebe ich eine Struktur als Parameter per Call by value, habe ich zum 
einen eine große lokale Kopie auf dem Stack und zum anderen eben nur 
eine Rückgabewert. Wenn ich das über Zeiger löse, wird dann nur die 
Anfangsadresse der Struktur kopiert, auf die der Zeiger zeigt oder alle 
Adressen der Strukturelemente? Weil dann würde ich genau so viel Platz 
vom stack für Kopien in Anspruch nehme wie bei call by value.
Tobi schrieb:
> dass die Adresse übergeben wird, aber im Prinzip kopiert man eine
> Adresse auf dem Stack und der Zeiger zeigt darauf.

Das wäre nicht die Adresse, sondern die Adresse der Adresse.

> Wenn ich das über Zeiger löse, wird dann nur die
> Anfangsadresse der Struktur kopiert,

Ja.

> auf die der Zeiger zeigt oder alle
> Adressen der Strukturelemente?

Nein.

Grössere Strukturen per value zu übergeben ist unüblich. Kleine werden 
auch gelegentlich per Register übergeben, wenn sie reinpassen. Also 
nicht mit Adresse im Register, sonder die struct selbst.
Tobi schrieb:
> Moin,
> ich habe eine Frage zu Zeigern als Parameter einer Funktion. Dabei wird
> statt dem Wert doch die Adresse kopiert oder?

Es wird der Wert des Zeigers kopiert. Das ist logischerweise die Adresse 
von dem, worauf er zeigt.

> Oft wird davon geredet, dass die Adresse übergeben wird, aber im Prinzip
> kopiert man eine Adresse auf dem Stack und der Zeiger zeigt darauf.

Man kopiert das, was in dem Zeiger steht, in die Funktion hinein. Ob das 
jetzt über einen Stack oder anders getan wird, spielt auf Ebene der 
Sprache keine Rolle.

> Wie ist es mit größeren Strukturen?

Wenn ich eine Struktur (ob nun größer oder nicht) als Parameter 
übergebe, ist das auch nicht anders. Es wird alles, was in der Struktur 
steht, in die Funktion kopiert.

> Übergebe ich eine Struktur als Parameter per Call by value, habe ich zum
> einen eine große lokale Kopie auf dem Stack und zum anderen eben nur
> eine Rückgabewert.

Was hat jetzt der Rückgabewert damit zu tun?

> Wenn ich das über Zeiger löse, wird dann nur die Anfangsadresse der
> Struktur kopiert, auf die der Zeiger zeigt oder alle Adressen der
> Strukturelemente?

Auch hier gilt: Es wird der Wert, der im Zeiger steht, kopiert. Wenn das 
die Anfangsadresse der Struktur ist, wird eben die Anfangsadresse der 
Struktur kopiert.
Tobi schrieb:
> Wenn ich das über Zeiger löse, wird dann nur die
> Anfangsadresse der Struktur kopiert, auf die der Zeiger zeigt oder alle
> Adressen der Strukturelemente?

Selbstverständlich nur die Anfangsadresse des Struct. Um auf die 
einzelnen Member zugreifen zu können, gibst du ja den Typ des Structs in 
der Parameterliste mit an. Der Compiler addiert den Offset des Members 
innerhalb des Struct auf deine Startadressse. Mehr ist das nicht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.