een lange titel

Pointers naar functies in C

Weinigen weten dat er in C pointers naar functies bestaan.

We zullen niet gauw pointers naar functies maken maar door de evolutie van C++ is het toch nuttig om weten dat ze bestaan. C++11 kent ondertussen lambdafuncties. En de pointers naar functies zijn nuttig om te begrijpen hoe lambdafuncties werken.

Hier is een voorbeeld:

// prototype
int som(int a, int b);

// functie
int som(int a, int b)
{
  return a + b;
}

// een pointer naar een functie
int (*ps)(int a, int b);

int main()
{
   ps = som;
   
   // oproep
   int c = (*ps)(4, 5);
}

In C is er een verschil tussen het prototype en de implementatie van een functie. Het prototype wordt gebruikt om bij de compiler aan te geven hoe de functie moet gebruikt worden.

De pointer naar de functie wordt zo int (*ps)(int a, int b); gedeclareerd. De verklaring is nu:

ps is een pointer naar een functie die twee int’s als parameter krijgt en die een int teruggeeft.

De ster wijst erop dat het een pointer is. Als we de eerste haken weglaten, dan wordt het int (*ps)(int a, int b);. Deze notatie heeft een andere betekenis:

ps is een functie die twee int’s als parameter krijgt en die een pointer naar een int teruggeeft.

Dit is heel iets anders.