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.
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.