Декларация
Прототип для функции, которая принимает параметр функции, выглядит следующим образом:
void func ( void (*f)(int) );
Это означает, что параметр f
будет указателем на функцию, которая имеет тип возврата void
и которая принимает единственный параметр int
. Следующая функция (print
) является примером функции, которая может быть передана в func
в качестве параметра, потому что это правильный тип:
void print ( int x ) {
printf("%d\n", x);
}
вызов функции
При вызове функции с параметром функции передаваемое значение должно быть указателем на функцию. Используйте имя функции (без скобок) для этого:
func(print);
вызовет func
, передав ему функцию печати.
Функция Body
Как и любой параметр, func теперь может использовать имя параметра в теле функции для доступа к значению параметра. Допустим, что func будет применять функцию переданную к числам 0-4. Сначала рассмотрим, как будет выглядеть цикл для непосредственного вызова print:
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
print(ctr);
}
Поскольку объявление параметров func
говорит, что f
- это имя для указателя на нужную функцию, мы сначала напомним, что если f
является указателем, то *f
- это то, на что указывает f
до (т.е. функция print
в данном случае). В результате просто замените все вхождения печати в цикле выше на *f
:
void func ( void (*f)(int) ) {
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
(*f)(ctr);
}
}
С http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html