- •Указатели на функции
- •Тип функции (* имя указателя) (спецификация параметров)
- •Int * ( * fptr ) ( char * , int );
- •Int (*ptr) (char*);
- •Имя_ указателя (список фактических параметров); (* имя указателя) (список фактических параметров);
- •Int len (char* e) {
- •Int main (){
- •Int (*ptr) (char*); //объявлен указатель на функцию
- •Массивы указателей на функции
- •Float ( * ptrArray [ 4 ] ) ( char , int ) ;
- •Определение типа указателя на функцию
- •Typedef int (* ptr) ( int);
- •Typedef void (* ptf ) ( ptr , int , char*);
- •Int main () { int n;
- •Void table ( func ptrA [ ] , int n, float xn , float xk , float dx )
- •Int main () {
- •Void main ( )
- •Ссылка на функцию Определение:
- •Void main ( )
- •Void (*pf) (char) (func) ;
- •Void (& rf)(char)( func ); Ссылка - возвращаемый результат функции
- •Return имя переменной;
- •Int & rmax ( int n , int d [ ] )
- •Void main ()
- •Рекурсивные функции
- •Шаблоны функций
- •Void swap (t&X, t&y)
- •Void swap (long &X, long &y) //2
- •Void swap (double &X, double &y) //3
- •Void main()
- •Свойства:
- •B func ( a r, c t ) { b V; …} -ошибка
- •Перегрузка функций
- •Void f (int);
- •Void f (int, int);
- •Void f (char*);
- •Void main ()
- •Подставляемые функции
- •Inline float Line(float x1,float y1,float x2, float y2)
Указатели на функции
Имя функции (без параметров и без типа результата) является указателем-константой на эту функцию. Значением этого указателя является адрес размещения операторов функции в оперативной памяти.
Это значение адреса можно присвоить другому указателю-переменной на функцию с тем же типом результата и с той же сигнатурой параметров. И затем этот новый указатель можно применять для вызова функции.
Введем понятие указателя на функцию.
Указатель на функцию – это некоторая переменная, значениями которой будут являться адреса функций, но адреса не любых функций, а функций, характеристики которых (тип результата и сигнатура параметров) должны быть указаны в определении указателя.
Определение указателя на функцию:
Тип функции (* имя указателя) (спецификация параметров)
= имя инициирующей функции;
при определении спецификации параметров достаточно перечислить через запятую типы параметров, имена параметров можно опустить;
тип_функции – это тип результата, возвращаемого функцией;
тип_функции и спецификация_параметров в определении указателя должны совпадать с соответствующими типами и сигнатурами тех функций, адреса которых предполагается присваивать определяемому указателю при инициализации или с помощью оператора присваивания;
инициализация не обязательна, но при ее наличии тип результата, и сигнатура параметров инициирующей функции должна полностью соответствовать указателю.
Например,
Int * ( * fptr ) ( char * , int );
Int (*ptr) (char*);
- определения двух указателей:
fptr – указатель на функции с параметрами типа указателя на char и типа int, которые возвращают в качестве результата указатель на int;
ptr - указатель на функции с параметрами типа указателя на char, которые возвращают значение типа int.
В примере указатели были определены без инициализации, но в дальнейшем этим указателям – переменным можно присвоить значения указателей – констант на функции, а именно идентификаторы (имена) конкретных функций, спецификации которых должны полностью соответствовать спецификациям в определениях указателей.
Как только некоторому указателю присвоено имя функции, вызов этой функции можно производить как, используя имя функции (как обычно), так и, используя имя указателя на функцию, который хранит адрес этой функции.
Эквивалентные вызовы функции с помощью указателя на эту функцию:
Имя_ указателя (список фактических параметров); (* имя указателя) (список фактических параметров);
Рассмотрим пример использования указателя на функции:
//определение функции вычисления длины строки-
// количества символов в строке до байтового нуля
#include <iostream>
using namespace std;
Int len (char* e) {
int m=0;
while (e[m++]);
return (m-1);
}
Int main (){
Int (*ptr) (char*); //объявлен указатель на функцию
ptr = len; //указателю присвоено значение – имя функции len;
char s [ ] = "rtgcerygw";
int n = ptr(s); cout<<n;
system("pause");
return 0;
}
Указателю – переменной можно присваивать имена различных функций (указателей – констант), у которых соответствующий указателю тип результата и сигнатура параметров. Присваивая указателю имена различных функций можно организовать вызов функций по адресам через указатель.
Пример вызова функций по адресам функций через указатель:
#include <iostream>
int add ( int n , int m ) { return ( n+m) ;}
int div ( int n , int m ) { return ( n / m) ;}
int mult ( int n , int m ) { return ( n * m) ;}
int subt ( int n , int m ) { return ( n - m) ;}
void main ( )
{ int ( * ptr) ( int , int ) ; // объявлен указатель на функцию
int a, b ; char c;
cout<<”Введите два числа и символ арифметической” “операции: ”;
cin >> a >> c >> b;
switch (c)
{ case ‘+’ : ptr = add ; break ;
case ‘-‘ : ptr = subt ; break;
case ‘ * ‘ : ptr = mult ; break;
case ‘ / ‘ : ptr = div ; break;
}
cout << a << c <<b<< “ =’’ << (*ptr) (a,b ) ; }
