Прежде всего, вы никогда не сможете типизировать указатель функции в указатель функции другого типа. Это неопределенное поведение в C (C11 6.5.2.2).
Очень важный совет при работе с указателями функций - всегда использовать typedefs.
Итак, ваш код можно / нужно переписать как:
typedef int (*func_t)(int*, int*);
int func0(int*,int*);
int func1(int*,int*);
int main(){
int i = 1;
myfunc(34,23, (i==1?func0:func1)); //34 and 23 are arbitrary inputs
}
void myfunc(int x, int y, func_t func){
Чтобы ответить на вопрос, вы хотите использовать указатели функций в качестве параметров, когда вы не знаете природу функции. Это часто встречается при написании общих алгоритмов.
Взять в качестве примера стандартную функцию C bsearch()
:
void *bsearch (const void *key,
const void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *, const void *));
);
Это универсальный алгоритм двоичного поиска, который осуществляет поиск в любой форме одномерного массива, содержащего неизвестные типы данных, такие как определяемые пользователем типы. Здесь функция «сравнения» сравнивает два объекта неизвестной природы на равенство, возвращая число, указывающее на это.
"Функция должна возвращать целое число меньше, равно или больше нуля, если ключевой объект считается, соответственно, меньше, чтобы соответствовать или быть больше, чем элемент массива."
Функция написана вызывающей стороной, которая знает природу данных. В информатике это называется «функциональным объектом» или иногда «функтором». Обычно встречается в объектно-ориентированном дизайне.
Пример (псевдокод):
typedef struct // some user-defined type
{
int* ptr;
int x;
int y;
} Something_t;
int compare_Something_t (const void* p1, const void* p2)
{
const Something_t* s1 = (const Something_t*)p1;
const Something_t* s2 = (const Something_t*)p2;
return s1->y - s2->y; // some user-defined comparison relevant to the object
}
...
Something_t search_key = { ... };
Something_t array[] = { ... };
Something_t* result;
result = bsearch(&search_key,
array,
sizeof(array) / sizeof(Something_t), // number of objects
sizeof(Something_t), // size of one object
compare_Something_t // function object
);