La partie classique sur les pointeurs de fonction est déjà discuté dans une autre réponse:
- Comme d'autres pointeurs, pointeurs de fonction peuvent pointer vers des objets différents à des moments différents de sorte qu'en comparant entre eux peut faire sens.
- Les pointeurs de fonction sont spéciaux et ne doivent pas être stockées dans d'autres types pointeur (même pas
void *
, et même en langage C).
- La partie riche (signature de fonction) est stocké dans le type de fonction - la raison pour laquelle la phrase ci-dessus.
Mais C est un (ancien) de la fonction de déclaration de mode. En plus de la pleine prototype de mode qui déclare le type de retour et le type pour tous les paramètres, C peut utiliser ce qu'on appelle de la liste des paramètres de mode qui est l'ancienne K&R mode. Dans ce mode, la déclaration que déclare le type de retour:
int (*fptr)();
En C, il déclare un pointeur de fonction retournant un int
et d'accepter l'ajout de paramètres arbitraires. Simplement, il aura un comportement indéterminé (UB) pour l'utiliser avec un mauvais paramètre de la liste.
Donc c'est légal, le code C:
#include <stdio.h>
#include <string.h>
int add2(int a, int b) {
return a + b;
}
int add3(int a, int b, int c) {
return a + b + c;
}
int(*fptr)();
int main() {
fptr = add2;
printf("%d\n", fptr(1, 2));
fptr = add3;
printf("%d\n", fptr(1, 2, 3));
/* fprintf("%d\n", fptr(1, 2)); Would be UB */
return 0;
}
Ne fais pas semblant je vous conseille de le faire! Il est désormais considéré comme la vétusté des fonction et devraient être évités. Je suis seulement en garde contre elle. À mon humble avis, ça ne pouvait être qu'exceptionnel acceptable des cas d'utilisation.