In de programmeertaal C worden parameters in functies altijd per waarde doorgegeven — dat wil zeggen, een kopie van de waarde uit de aanroepende code wordt naar de functie doorgegeven. Als het nodig is om de waarde van een variabele buiten de functie te veranderen, wordt pointer-parameter doorgegeven.
Bij het doorgeven van een scalair (bijvoorbeeld, int) ontvangt de functie zijn eigen kopie:
void foo(int a) { a = 10; } int main() { int x = 5; foo(x); // x == 5, verandert niet! }
Om de waarde van een variabele te veranderen, gebruiken we een pointer:
void foo(int* a) { *a = 10; } int main() { int x = 5; foo(&x); // x == 10, waarde is veranderd! }
Is een array een parameter van de functie die per referentie wordt doorgegeven?
Veel mensen antwoorden "per referentie", maar in C kan een array in de functiehandtekening niet per referentie worden doorgegeven; feitelijk degradeert het naar een pointer.
Juiste antwoord:
Wanneer een array naar een functie wordt doorgegeven, wordt feitelijk een pointer naar het eerste element doorgegeven. Dat wil zeggen dat de aangeroepen functie de werkelijke grootte van de array niet weet, en eventuele wijzigingen aan de elementen van de array reflecteren op de originele array.
void foo(int arr[]) { arr[0] = 100; } int main() { int a[3] = {1,2,3}; foo(a); // a[0] wordt 100! }
Geschiedenis
int arr[10] bijwerkte, maar in de aanroepende code was de array kleiner. Omdat de functie de werkelijke grootte niet kende, vond er een buffer overflow en geheugenbeschadiging plaats.