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