pointeur de fonction comme argument
-
22-09-2019 - |
Question
Est-il possible de passer un pointeur de fonction comme un argument à une fonction C?
Si oui, comment pourrais-je déclarer et définir une fonction qui prend un pointeur de fonction comme argument?
La solution
Certainement.
void f(void (*a)()) {
a();
}
void test() {
printf("hello world\n");
}
int main() {
f(&test);
return 0;
}
Autres conseils
Disons que vous avez la fonction
int func(int a, float b);
pointeur vers elle sera
int (*func_pointer)(int, float);
Alors que vous pouvez l'utiliser comme ceci
func_pointer = func;
(*func_pointer)(1, 1.0);
/*below also works*/
func_pointer(1, 1.0);
Pour éviter de spécifier le type plein pointeur à chaque fois que vous en avez besoin vous coud typedef
it
typedef int (*FUNC_PTR)(int, float);
et que d'utiliser comme tout autre type
void executor(FUNC_PTR func)
{
func(1, 1.0);
}
int silly_func(int a, float b)
{
//do some stuff
}
main()
{
FUNC_PTR ptr;
ptr = silly_func;
executor(ptr);
/* this should also wotk */
executor(silly_func)
}
Je suggère de regarder le monde célèbre C faqs.
Ceci est un bon exemple:
int sum(int a, int b)
{
return a + b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int mathOp(int (*OpType)(int, int), int a, int b)
{
return OpType(a, b);
}
int main()
{
printf("%i,%i", mathOp(sum, 10, 12), mathOp(div, 10, 2));
return 0;
}
The output is : '22, 5'
Vérifier qsort()
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
Le dernier argument de la fonction est un pointeur de fonction. Lorsque vous appelez qsort()
dans un programme de la vôtre, l'exécution « va dans la bibliothèque » et « pas en arrière dans votre propre code » grâce à l'utilisation de ce pointeur.
Comme dit par d'autres réponses, vous pouvez le faire comme dans
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
Cependant, il y a un cas particulier pour déclarer un argument de type pointeur de fonction: si un argument a le type de fonction, il sera converti en un pointeur sur le type de fonction, tout comme les tableaux sont convertis en pointeurs dans les listes de paramètres, de sorte que le premier peut également être écrit comme
void qsort(void *base, size_t nmemb, size_t size,
int compar(const void *, const void *));
Bien entendu cela s'applique aux seuls paramètres, comme en dehors d'une liste de paramètres int compar(const void *, const void *);
déclarerait une fonction.