Указатели на функции
Имя функции (без параметров и без типа результата) является указателем-константой. Значением этого указателя является адрес размещения операторов функции в оперативной памяти. Это значение адреса можно присвоить другому указателю-переменной на функцию с тем же типом результата и с той же сигнатурой параметров. И затем этот новый указатель можно применять для вызова функции.
Введем понятие указателя на функцию. Указатель на функцию – это некоторая переменная, значениями которой будут являться адреса функций, характеристики которых (тип результата и сигнатура параметров) должны быть указаны в определении указателя.
Определение указателя на функцию:
< тип_функции> (* имя указателя ) ( спецификация_параметров) =
< имя инициирующей функции>;
- при определении спецификации параметров достаточно перечислить через запятую типы параметров, имена параметров можно опустить;
- тип_функции – это тип результата, возвращаемого функцией;
- тип_функции и спецификация_параметров в определении указателя должны совпадать с соответствующими типами и сигнатурами тех функций, адреса которых предполагается присваивать определяемому указателю, например, с помощью оператора присваивания;
- инициализация указателя не обязательна, но при ее наличии тип результата, и сигнатура параметров инициирующей функции должна полностью соответствовать указателю.
Например:
int * ( * fptr ) ( char * , int );
int (*ptr) (char*);
- определения двух указателей:
fptr – указатель на функции с параметрами типа указателя на char и типа int, которые возвращают в качестве результата указатель на int;
ptr - указатель на функции с параметрами типа указателя на char, которые возвращают значение типа int.
В примере указатели были определены без инициализации, но в дальнейшем этим указателям на функции – переменным можно присвоить значения указателей – констант, а именно идентификаторы конкретных функций, спецификации которых должны полностью соответствовать спецификациям в определениях указателей.
Как только некоторому указателю присвоено имя функции, вызов этой функции можно производить как стандартно, используя имя функции, так и используя имя указателя на функцию, который хранит адрес этой функции.
Эквивалентные вызовы функции с помощью указателя на эту функцию:
имя указателя (список фактических параметров);
( * имя указателя) (список фактических параметров);
Рассмотрим, как можно использовать указатель на функцию.
Определить и вызвать функцию вычисления длины строки - количества символов в строке до байтового нуля, строка – параметр функции. Вызов функции производить, используя указатель на функцию.
//Определение функции:
int len ( char * e)