Язык Си позволяет применять для вызова функции указатель особого рода – указатель на функцию. Имя функции – это указатель-константа, равный адресу точки входа в функцию (адрес первой машинной команды функции). Кроме того, можно описать указатель-переменную на функцию вида
тип (* имя) (список типов);, где
тип – спецификатор типа возвращаемого функций значения;
имя – идентификатор указателя-переменной на функцию;
список типов – необязательный перечень типов аргументов, передаваемых функции при ее вызове по значению указателя.
Например, рассмотрим определение объекта fun:
int (*fun) (int);
1) объект с этим именем есть
2) указатель
3) на функцию
4) с одним аргументом типа int
5) и возвращаемое значение типа int.
Скобки (*fun) необходимы, так как в описании скобки () связываются с именем раньше, чем символ ‘*’. Объявление вида int *fun (); означает функцию fun, возвращающую указатель на объект целого типа. Точно так же как указание имени массива без [ ] означает адрес его первого байта, указание имени функции без () задаёт адрес её начала.
Пример. Демонстрация использования указателя-переменной на функцию (funprt), которой можно присваивать ссылки на разные функции.
Программа:
#include <stdio.h>
#include <conio.h> /* для функций clrscr и getch */
int difference (int, int); /* прототипы функций */
int sum (int, int);
void main ()
{ /* int (*funptr) (int, int); указатель-переменная на функцию с 2-мя аргументами */
int (*funptr) (); /* указатель-переменная без аргументов */
int var1=2, var2=5, ret; /* рабочие переменные */
clrscr(); /* очистка экрана */
funptr = difference; /* указатель получает адрес 1-й функции */
ret = funptr(var1, var2); /* результат функции по указателю */
puts (“Результаты программы:”);
printf (“ret = %d\n”, ret); /* вывод результата */
funptr = sum; /* указатель получает адрес 2-й функции */
ret = funptr(var1, var2); /* результат функции по указателю */
printf (“ret = %d\n”, ret); /* вывод результата */
getch(); /* задержка экрана результатов */
}
int difference (int a, int b) /* описание функции вычитания */
{return (a – b);}
int sum (int a, int b) /* описание функции сложения */
{return (a+b);}
Результаты программы:
ret = –3
ret = 7