Подтвердить что ты не робот

Указатель функции как аргумент

Можно ли передать указатель функции в качестве аргумента функции в C?

Если да, как бы объявить и определить функцию, которая принимает указатель на функцию в качестве аргумента?

4b9b3361

Ответ 1

Конечно.

void f(void (*a)()) {
    a();
}

void test() {
    printf("hello world\n");
}

int main() {
     f(&test);
     return 0;
}

Ответ 2

Допустим, у вас есть функция

int func(int a, float b);

Так что указатель на это будет

int (*func_pointer)(int, float);

Так что вы могли бы использовать это так

  func_pointer = func;
  (*func_pointer)(1, 1.0);

  /*below also works*/
  func_pointer(1, 1.0);

Чтобы не указывать полный тип Pointer каждый раз, когда вам это нужно вы coud typedef во его

typedef int (*FUNC_PTR)(int, float);

и чем использовать как любой другой тип

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)
}

Я предлагаю посмотреть на всемирно известные C faqs.

Ответ 3

Это хороший пример:

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'

Ответ 4

Я предлагаю посмотреть всемирно известный C faqs

Ответ 5

Проверьте qsort()

void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

Последний аргумент функции - это указатель на функцию. Когда вы вызываете qsort() в своей программе, выполнение "переходит в библиотеку" и "возвращается в свой собственный код" с помощью этого указателя.

Ответ 6

Как говорят другие ответы, вы можете сделать это как в

void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

Однако существует один особый случай для объявления аргумента типа указателя на функцию: если аргумент имеет тип функции, он будет преобразован в указатель на тип функции, точно так же, как массивы преобразуются в указатели в списках параметров, поэтому первый также может быть написано как

void qsort(void *base, size_t nmemb, size_t size,
           int compar(const void *, const void *));

Естественно, это относится только к параметрам, как вне списка параметров int compar(const void *, const void *); объявил бы функцию.