non passiamo parametri a visualizza? come fa a sapere quale variabili prendere?
L'unica cosa che devi passare è l'indirizzo della funzione
visualizza, e al momento della chiamata devi aggiungerci i parametri.
visualizza è un indirizzo simbolo rilasciato dal compilatore per identificare la funzione, nonché il punto d'ingresso alla funzione stessa. I parametri vengono passati dal chiamante, come è consuetudine fare. Compreso questo concetto, devi semplicemente definirlo come hai visto sopra:
mettendo delle parentesi nella funzione puntatore e
definire i parametri.
Un esempio in C di puntatore a funzione che passa un puntatore a struct. un int e ritorna un int.
#include <stdio.h>
typedef struct foo { const char *s; }foo;
int trot(foo *foobar, int n)
{
while (n--)
printf ("%s\n",foobar[n].s);
return n; // return -1
}
int fox(foo *foobar, int n, int (*pf)(foo*, int n))
{
return (*pf)(foobar, n); // così
return pf(foobar, n); // o così
}
int main ()
{
foo foobar[]={ {"aaa"},{"bbb"},{"ccc"},{"ddd"},{"..."} };
int n=sizeof(foobar)/sizeof(foobar[0]);
printf ("trot addr=%p\n"
"trot return %d\n", trot,fox(foobar, n, trot));
return 0;
}
Di seguito andiamo a ritrovare l'indirizzo della funzione nella symbol table dell'eseguibile
% gcc prova.c -Wall
% ./a.out
...
ddd
ccc
bbb
aaa
trot addr=0x400584
trot return -1
%
% objdump -t a.out | grep trot
0000000000400584 g F .text 000000000000003d trot
%