Est-il possible de transmettre un pointeur de fonction en tant qu'argument à une fonction dans C?Pointeur de fonction en tant qu'argument
Si oui, comment déclarer et définir une fonction qui prend un pointeur de fonction en tant qu'argument?
Est-il possible de transmettre un pointeur de fonction en tant qu'argument à une fonction dans C?Pointeur de fonction en tant qu'argument
Si oui, comment déclarer et définir une fonction qui prend un pointeur de fonction en tant qu'argument?
Certainement.
void f(void (*a)()) {
a();
}
void test() {
printf("hello world\n");
}
int main() {
f(&test);
return 0;
}
Je suggère de regarder le monde célèbre C faqs
Disons que vous avez la fonction
int func(int a, float b);
pointeur Donc il sera
int (*func_pointer)(int, float);
Alors que vous pouvez utiliser comme ça
func_pointer = func;
(*func_pointer)(1, 1.0);
/*below also works*/
func_pointer(1, 1.0);
Pour éviter de déterminer le type plein pointeur à chaque fois que vous en avez besoin vous coud typedef
il
typedef int (*FUNC_PTR)(int, float);
et que l'utilisation 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 .
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 de vos programmes, l'exécution "entre dans la bibliothèque" et "revient dans votre propre code" grâce à l'utilisation de ce pointeur.
un bon exemple:
#include <iostream>
using namespace std;
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()
{
cout << mathOp(sum, 10, 12) << ", " << mathOp(div, 10, 2) << endl;
return 0;
}
sortie est: '22, 5'
Changer l'appel à f (test); –
Les deux vont fonctionner. L'esperluette est facultative. Donc déréférencer le pointeur lorsque vous appelez le pointeur de fonction. –
Certes, il n'y a pas besoin de changer quoi que ce soit. De plus, même la syntaxe "pointeur" dans la déclaration des paramètres est facultative. Le 'f' ci-dessus aurait pu être déclaré comme' void f (void a()) '. – AnT