Notare che i tipi puntatori a funzioni sono tipi puntatori come gli altri che quindi si possono usare anche per dichiarare variabili e per costruire tipi strutturati (es. un array di puntatori a funzioni).
Un parametro formale di tipo funzione si dichiara nel seguente modo
TYPE(*IDENTIFIER) (FORMAL PARAMETERS)
dove
Il corrispondente parametro attuale sarà il nome di una funzione dichiarata nel programma tale che il tipo dei valori ritornati e dei parametri è in accordo a quelli del parametro formale.
#include <stdio.h>
#define DIM 5
#define TRUE 1
void Map(int v[] /*valore*/, int len, int (*op)(int),
int res[]/*variabile*/ )
/* applica op, una funzione che preso un intero ritorna un intero,
a tutti gli elementi di v e ritorna il nuovo array in res*/
{
int i;
for(i=0; i < len ; i++)
res[i] = (*op)(v[i]);
}
int Apply(int v[]/*valore*/, int len, int (*op)(int,int),
int identity /*identita' di op*/)
/*ritorna v[0] op v[1] op ... op v[len-1],
dove op e' una funzione che presi due interi ritorna un intero */
{
int i, res = identity;
for(i=0; i < len ; i++)
res = (*op)(v[i],res);
return res;
}
int And(int x, int y){ return x && y; };
int All(int v[] /*valore*/, int len, int (*op)(int))
/*controlla se op vale su tutti gli elementi di v,
dove op e' una funzione da interi in booleani (simulati da interi in C)*/
{
int aux[DIM];
Map(v,len,(*op),aux);
return(Apply(aux,len,And,TRUE));
}
int Add(int x, int y){ return x + y; }
int Prod(int x, int y){ return x * y; }
int Dec(int x){ return x-1; }
int Pos(int x){ return x > 0; }
main(){
int vet[DIM] = { 1, 2, 3, 4, 5 };
int w[DIM];
int i;
printf("La somma di tutti gli elementi di vet e\' %d\n",Apply(vet,DIM,Add,0));
printf("Il prodotto di tutti gli elementi di vet e\' %d\n",Apply(vet,DIM,Prod,1));
Map(vet,DIM,Dec,w);
for(i=0;i<DIM;i++)
printf("%d ",w[i]);
printf("\n");
if(All(vet,DIM,Pos)) printf("in vet tutti positivi\n");
if(!All(w,DIM,Pos)) printf("in w non tutti positivi\n");
}