Указатель на функцию

 

На функцию, как и на любой другой объект, можно создать указатель. Указатель на функцию содержит адрес первого оператора исполняемого кода функции. Форма записи:

модификатор тип (*имя_указателя)(список_формальных_параметров)

Смысл поля модификатор аналогичен смыслу поля модификатор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