In der Programmiersprache C werden die Parameter in Funktionen immer durch Wert übergeben — das bedeutet, eine Kopie des Wertes aus dem aufrufenden Code wird in die Funktion übergeben. Wenn der Wert einer Variablen außerhalb der Funktion geändert werden soll, wird die Übergabe durch einen Zeiger verwendet.
Bei der Übergabe eines Skalars (zum Beispiel int) erhält die Funktion ihre Kopie:
void foo(int a) { a = 10; } int main() { int x = 5; foo(x); // x == 5, wird nicht geändert! }
Um den Wert einer Variablen zu ändern, wird ein Zeiger verwendet:
void foo(int* a) { *a = 10; } int main() { int x = 5; foo(&x); // x == 10, Wert wurde geändert! }
Ist ein Array ein Parameter der Funktion, der durch Referenz übergeben wird?
Viele antworten, dass es "durch Referenz" ist, jedoch kann in C ein Array in der Funktionssignatur nicht durch Referenz übergeben werden, tatsächlich degradiert es zu einem Zeiger.
Richtige Antwort:
Wenn ein Array in eine Funktion übergeben wird, wird tatsächlich ein Zeiger auf sein erstes Element übergeben. Das bedeutet, dass die aufgerufene Funktion die tatsächliche Größe des Arrays nicht kennt und alle Änderungen der Array-Elemente auf das ursprüngliche Array zurückwirken.
void foo(int arr[]) { arr[0] = 100; } int main() { int a[3] = {1,2,3}; foo(a); // a[0] wird 100 sein! }
Geschichte
int arr[10] deklariert war, aber im aufrufenden Code war das Array kleiner. Da die Funktion die tatsächliche Größe nicht kannte, kam es zu einem Buffer-Überlauf und zu Speicherbeschädigungen.