Was ist der Unterschied zwischen Call by Value und Call by Reference in C?
Einführung
In der Programmiersprache C gibt es verschiedene Methoden, wie Argumente an Funktionen übergeben werden können. Die beiden grundlegendsten Konzepte sind Call by Value und Call by Reference. Diese Methoden unterscheiden sich darin, wie Daten von einer Funktion verarbeitet und verändert werden können.
Call by Value
Beim Call by Value wird der Wert der übergebenen Variable an die Funktion kopiert. Das bedeutet, dass die Funktion eine neue lokale Kopie des Wertes erhält und mit dieser Kopie arbeitet. Änderungen, die innerhalb der Funktion an diesem Parameter vorgenommen werden, betreffen nur die lokale Kopie und haben keinen Einfluss auf die originale Variable außerhalb der Funktion.
Beispiel: Wenn eine Variable int a = 5; besteht und diese per Call by Value an eine Funktion übergeben wird, dann arbeitet die Funktion intern mit einer Kopie von a. Selbst wenn die Funktion den Wert ändert, bleibt der Wert von a in der ursprünglichen Funktion unverändert.
Call by Reference
Im Gegensatz dazu bedeutet Call by Reference, dass nicht der Wert selbst, sondern die Adresse (Referenz) der Variable an die Funktion übergeben wird. Das geschieht in C durch die Verwendung von Zeigern (Pointer). Innerhalb der Funktion kann man über die übergebene Speicheradresse direkt auf die originale Variable zugreifen und sie verändern.
Dadurch beeinflussen alle Änderungen an der Variable innerhalb der Funktion auch die ursprüngliche Variable außerhalb der Funktion. Dies wird häufig genutzt, wenn eine Funktion mehrere Werte zurückgeben oder Änderungen an großen Datenstrukturen vornehmen soll, ohne Daten zu kopieren.
Technische Umsetzung in C
In C ist die Parameterübergabe standardmäßig Call by Value. Will man Call by Reference simulieren, übergibt man Zeiger als Parameter. Zum Beispiel übergibt man anstatt eines int-Werts einen Zeiger auf ein int (int*). Die Funktion kann dann über diesen Zeiger auf den Originalwert zugreifen und diesen verändern.
Beispiel Call by Value:
void increment(int x) { x = x + 1;}int main() { int a = 5; increment(a); // a bleibt 5, da nur die Kopie von a erhöht wurde}Beispiel Call by Reference mit Zeiger:
void increment(int* x) { (*x) = (*x) + 1;}int main() { int a = 5; increment(&a); // a ist jetzt 6, da die Funktion direkt auf a zugreift}Zusammenfassung
Call by Value übergibt eine Kopie des Wertes an die Funktion, wodurch Änderungen lokal sind und das Original nicht beeinflussen. Call by Reference übergibt eine Referenz (in C: einen Zeiger) auf die Variable, sodass Änderungen innerhalb der Funktion auf die originale Variable wirken. Während C selbst nur Call by Value unterstützt, ermöglicht es die Verwendung von Zeigern eine Konstruktion, die dem Call by Reference nahekommt.
