Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Указатели на функции.doc
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
45.89 Кб
Скачать

21

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

Имя функции (без параметров и без типа результата) является указателем-константой на эту функцию. Значением этого указателя является адрес размещения операторов функции в оперативной памяти.

Это значение адреса можно присвоить другому указателю-переменной на функцию с тем же типом результата и с той же сигнатурой параметров. И затем этот новый указатель можно применять для вызова функции.

Введем понятие указателя на функцию.

Указатель на функцию – это некоторая переменная, значениями которой будут являться адреса функций, но адреса не любых функций, а функций, характеристики которых (тип результата и сигнатура параметров) должны быть указаны в определении указателя.

Определение указателя на функцию:

Тип функции (* имя указателя) (спецификация параметров)

= имя инициирующей функции;

  • при определении спецификации параметров достаточно перечислить через запятую типы параметров, имена параметров можно опустить;

  • тип_функции – это тип результата, возвращаемого функцией;

  • тип_функции и спецификация_параметров в определении указателя должны совпадать с соответствующими типами и сигнатурами тех функций, адреса которых предполагается присваивать определяемому указателю при инициализации или с помощью оператора присваивания;

  • инициализация не обязательна, но при ее наличии тип результата, и сигнатура параметров инициирующей функции должна полностью соответствовать указателю.

Например,

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 ) ; }