Функцию можно вызвать через указатель на нее. Для этого объявляется указатель соответствующего типа и ему с помощью операции взятия адреса присваивается адрес функции:
void f(int а ) { / * . . . * / } // определение функции
void (*pf)(int); // указатель на функцию
…
pf = &f; // указателю присваивается адрес функции
/ / (можно написать pf = f ;)
pf(l0); // функция f вызывается через указатель pf
// (можно написать (*pf)(10) )
Для того чтобы сделать программу легко читаемой, при описании указателей на функции используют переименование типов (typedef). Можно объявлять массивы указателей на функции (это может быть полезно, например, при реализации меню):
// Описание типа PF как указателя на функцию с одним параметром типа int;
typedef void (*PF)(int);
// Описание и инициализация массива указателей:
PF menu[] = {&new, &open, &save};
menu[l](10); // Вызов функции open
Здесь new, openи save— имена функций, которые должны быть объявлены ранее.
Указатели на функции передаются в подпрограмму таким же образом, как и параметры других типов:
#include <iostream.h>
typedef void (*PF)(int);
void f1(PF pf){ // функция f l получает в качестве параметра указатель типа PF
pf(5); // вызов функции, переданной через указатель
}
void f(int i ){cout <<i :}
int main(){
f l( f ) ;
return 0:
}
Тип указателя и тип функции, которая вызывается посредством этого указателя, должны совпадать в точности.