Nous allons aller dans le vif du sujet directement.
En 1er, comment déclarer un pointeur de fonction.
Quel type allons nous utiliser ??
Bingo ! le type void* !
Donc on obtient :
void *p = NULL;
Il y a un problème : c'est quoi l'adresse de la fonction?
En fait, l'adresse d'une fonction est la première instruction qu'elle contient, vachement utile!
On va donc tester comme avec un pointeur normal, c'est-à-dire:
p = &fonction;
Mais cela ne marche pas...

On va faire des tests avec une fonction simple :
void fonction()
{
printf("ca marche !\n);
getchar();
}
En premier, indiquons que le pointeur est un pointeur de fonction :
void (*p)();
Pourquoi toutes ces paranthèses ?
Voilà la réponse :
* est un opérande utilisé en préfixe et il a une priorité plus faible que () ; c'est pourquoi les parenthèses sont nécessaire pour forcer l'association correcte.
Donc cela perrmet de passer * en priorité (comme en maths, 2+3*2 est différent de (2+3)*2 !)
On peut donc recompiler!
Prenons une autre fonction :
int fonction2(int a, int b)
{
return a += b;
}
Les secondes parenthèses dans la déclaration du pointeur deviennent utiles, car quel que soit la fonction, un pointeur de fontion ne peut contenir que les fonction qui ont les mêmes types des paramètres.
En gros :
void (*p)();
p = &fonction2;
est faux, il faut mettre int, int entre les secondes parenthèses.
Avant de s'en servir, une petite chose :
Un nom de fonction est automatiquement converti en pointeur sur cette fonction, il n'y a pas besoin du & mais c'est permis et il n'y a pas vraiment de différence.
Donc on peut mettre
p = fonction2 ;
.
La vie c'est comme Windows : y a toujours un problème qu'on a pas prévu...