Forum: PC-Programmierung Call by Reference - Allgemein


von Tobi (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

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.

von Slippin J. (gustavo_f)


Lesenswert?

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.

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.