
- •Введение
- •Разработка функций рекурсивных и без рекурсии, использующих параметр – функцию и оператор return
- •Return (выражение);
- •Функция возвращает значение любого простого типа
- •Функция возвращает указатель на скаляр, массив, структуру, файл или функцию
- •А) Функция возвращает указатель на скаляр
- •Б) Функция возвращает указатель на первый элемент одномерного массива
- •3) Ссылка - возвращаемый результат функции
- •Return имя переменной;
- •2.2.2 Рекурсивные функции
- •2.2.3 Указатели на функции
- •( * Имя указателя) (список фактических параметров);
- •2.2.4 Массивы указателей на функции
- •2.2.5 Определение типа указателя на функцию
- •2.2.6 Указатель на функцию - параметр функции
- •2.3 Задание на выполнение лабораторной работы
- •Порядок выполнения работы
- •Пример выполнения лабораторной работы
- •2.6 Контрольные вопросы
- •2.7 Варианты заданий лабораторной работы
- •Лабораторная работа № 6 Разработка программ с использованием структурированных данных
- •3.1 Цель лабораторной работы
- •Теоретические сведения
- •3.2.1 Структурные типы и структуры
- •Для обращения к элементам, входящим в состав конкретной структуры используются уточненные имена:
- •(*Имя указателя). Имя элемента структуры
- •3.2.2 Инициализация структур
- •3.2.3 Динамическое выделение памяти под структуру и массив структур
- •Элементы структур
- •Элементы структуры могут иметь одинаковый тип, тогда при описании таких элементов можно указывать их общий тип, а имена перечислить через запятую:
- •Struct def { def a , int b; } ; // - ошибка!
- •Strspy ( a.Fio, “ Петров”) ;
- •3.2.5 Структуры и функции
- •3.2.6 Использование массива указателей, инициированного строками
- •3.3 Задание на выполнение лабораторной работы
- •3.4 Порядок выполнения работы
- •3.5. Пример выполнения лабораторной работы
- •3.6 Контрольные вопросы
- •3.7 Варианты заданий лабораторной работы
- •4. Список литературы
2.2.3 Указатели на функции
Имя функции (без параметров и без типа результата) является указателем-константой. Значением этого указателя является адрес размещения операторов функции в оперативной памяти. Это значение адреса можно присвоить другому указателю-переменной на функцию с тем же типом результата и с той же сигнатурой параметров. И затем этот новый указатель можно применять для вызова функции.
Введем понятие указателя на функцию. Указатель на функцию – это некоторая переменная, значениями которой будут являться адреса функций, характеристики которых (тип результата и сигнатура параметров) должны быть указаны в определении указателя.
Определение указателя на функцию:
< тип_функции> (* имя указателя ) ( спецификация_параметров) =
< имя инициирующей функции>;
при определении спецификации параметров достаточно перечислить через запятую типы параметров, имена параметров можно опустить;
тип_функции – это тип результата, возвращаемого функцией;
тип_функции и спецификация_параметров в определении указателя должны совпадать с соответствующими типами и сигнатурами тех функций, адреса которых предполагается присваивать определяемому указателю, например, с помощью оператора присваивания;
инициализация указателя не обязательна, но при ее наличии тип результата, и сигнатура параметров инициирующей функции должна полностью соответствовать указателю.
Например:
int * ( * fptr ) ( char * , int );
int (*ptr) (char*);
- определения двух указателей:
fptr – указатель на функции с параметрами типа указателя на char и типа int, которые возвращают в качестве результата указатель на int;
ptr - указатель на функции с параметрами типа указателя на char, которые возвращают значение типа int.
В примере указатели были определены без инициализации, но в дальнейшем этим указателям на функции – переменным можно присвоить значения указателей – констант, а именно идентификаторы конкретных функций, спецификации которых должны полностью соответствовать спецификациям в определениях указателей.
Как только некоторому указателю присвоено имя функции, вызов этой функции можно производить как стандартно, используя имя функции, так и используя имя указателя на функцию, который хранит адрес этой функции.
Эквивалентные вызовы функции с помощью указателя на эту функцию:
имя указателя (список фактических параметров);
( * Имя указателя) (список фактических параметров);
Рассмотрим, как можно использовать указатель на функцию.
Определить и вызвать функцию вычисления длины строки - количества символов в строке до байтового нуля, строка – параметр функции. Вызов функции производить, используя указатель на функцию.
//Определение функции:
int len ( char * e)
{ int m=0;
while(e[m++] ) ;
return m-1 ;
}
void main ()
{ int (*ptr) (char*);
// объявлен неинициализированный указатель на функцию
ptr = len ;
// указателю присвоено значение – имя функции len;
char s [ ] =” rtgcerygw”;
//объявлен символьный массив, инициализированный строкой;
int n;
n = (* ptr) ( s);
//вызов функции с помощью указателя;
// эквивалентные вызовы: n = ptr (s) и n= len(s);
}
Указателю – переменной можно присваивать имена различных функций (указателей – констант), у которых соответствующий указателю тип результата и сигнатура параметров. Присваивая указателю имена (адреса) различных функций можно организовать вызов той или иной функции в соответствии со значением указателя.
Пример вызова функций через указатель:
#include <iostream.h>
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 ) ; }