На функцию, как и на любой другой объект, можно создать указатель. Указатель на функцию содержит адрес первого оператора исполняемого кода функции. Форма записи:
модификатор тип (*имя_указателя)(список_формальных_параметров)
Смысл поля модификатор аналогичен смыслу поля модификатор1 при определении функции. Поле тип определяет тип возвращаемого функцией значения. Поле имя_указателя является идентификатором указателя. Поле список_формальных_параметров содержит список формальных параметров функции. Для обращения к функции через указатель на функцию данному указателю должно быть присвоено значение адреса функции. Форма записи:
имя_указателя=имя_функции
или
имя_указателя=&имя_функции
Поле имя_функции содержит имя функции, адрес которой присваивается указателю. Скобки, являющиеся операцией «вызов функции», не ставятся. Содержимое поля список_формальных_параметров в объявлении указателя должно совпадать с содержимым аналогичных полей в объявлении и определении функции.
Вызов функции через указатель на функцию осуществляется через обращение по адресу указателя с указанием в скобках фактических параметров вызова функции. Форма записи:
(*имя_указателя)(список_фактических_параметров)
или
имя_указателя(список_фактических_параметров)
Можно определить массив указателей на функции. Форма записи:
тип (*имя_указателя[размер1][размер2]…[размерN]) (список_формальных_параметров)={список_инициализаторов}
Смысл полей тип, имя_указателя и список_формальных_параметров такой же, как и при объявлении указателя на функцию, смысл полей, определяющих размеры массива, и поля список_инициализаторов такой же, как и при объявлении массивов. При этом возможно использование формы объявления массива указателей на функцию, аналогичной второй форме объявления массива. Недостаток массива указателей на функцию в том, что списки формальных параметров всех функций, на которые указывают указатели массива, должны совпадать.
Пример 12
int sum(int a, int b)
{
return a+b;
}
int square_sum (int (*p)(int,int),int x, int y)
{
int sum=p(x,y);
return sum*sum;
}
void main(void)
{
int (*f)(int,int);
f=sum;
printf("%d %d",(*f)(3,2),square_sum(f,3,4));
}
На экране будет напечатано: 5 49