Для оголошення вказівників на функцію використовують таку синтаксичну конструкцію:
тип ( * ім’я_вказівника ) ( список_параметрів_функції )
Операція ( ) – «функція», має вищий пріоритет, ніж операція * - «вказівник». Без дужок навколо * ім’я вказівника оголошення буде прототипом функції, яка використовує відповідні параметри і повертає значення, яке є вказівником. У списку параметрів вказують тільки типи без імен.
Для присвоєння вказівнику адреси певної функції можна використовувати її ім’я або вираз & ім’я функції. Коли вказівник отримав адресу функції, його можна застосовувати для звертання до цієї функції таким чином:
( * вказівник_на_функцію ) ( параметри_функції )
Наприклад:
#include <iostream>
using namespace std;
void print_hello( void ) {
cout << "Hello from print_hello" << endl;
}
int plus_one( int a ) {
return a + 1;
}
int main() {
// вказівник на функцію print_hello
void ( * p1 )( void );
print_hello( );
p1 = print_hello;
( *p1 )();
// вказівник на функцію plus_one
int ( * p2 )( int );
cout << plus_one( 1 ) << endl;
p2 = & plus_one;
cout << ( *p2 )( 2 ) << endl;
}
Створимо функцію, яка буде обчислювати значення визначеного інтеграла методом прямокутників. В функцію будемо передавати інтервал інтегрування, кількість частин, на які розбивається інтервал інтегрування, і вказівник на функцію, інтеграл якої необхідно знайти.
#include <iostream>
using namespace std;
double simpson( double ( * f )( double ), double a, double b, int n ) {
double s = 0, h = ( b - a ) / n, x;
for ( x = a + 0.5 * h; x < b; x += h )
s += ( *f )( x );
return s * h;
}
double f1( double x ) {
return sin( x ) + cos( x );
}
int main() {
cout << simpson( sin, 0, 1, 100) << endl;
cout << simpson( f1, 0, 1, 100) << endl;
double ( * p )( double );
p = f1;
cout << simpson( p, 0, 1, 100) << endl;
}