logo
Подбельский Фомин_Программирование на языке СИ_

Указатель на функцию как возвращаемое функцией значение.

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

Рассмотрим программу, демонстрирующую особенности такой организации меню.

В программе определены три функции: первые две функции f 1 ( ) и f2( ) с прототипом вида

int f (void);

(пустой список параметров, возвращается значение типа int) и третья функция menu() с прототипом

int (*menu(void)) (void);

которая возвращает значение указателя на функции с пустыми списками параметров, возвращающие значения типа int.

При выполнении функции menu( ) пользователю дается возможность выбора из двух пунктов меню. Пунктам меню соответствуют определенные выше функции fl( ) и f2( ), указатель на одну из которых является возвращаемым значением. При неверном выборе номера пункта возвращаемое значение становится равным NULL.

В основной программе определен указатель г, который может принимать значения адресов функций f1( ) и f2( ). В бесконечном цикле выполняются обращения к функции menu( ), и если результат равен NULL, то программа печатает "The End" и завершает выполнение. В противном случае вызов

обеспечивает исполнение той из функций fl() или f2(), адрес которой является значением указателя r. Текст программы*:

* Исходный вариант программы предложен С.М. Лавреневым.

Результаты выполнения программы:

В функции menu() определен массив menu_items[ ] указателей на функции. В качестве инициализирующих значений в списке использованы имена функций f1( ) и f2():

int (* menu_items[ ] ) ( ) = {fl, f2};

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

typedef int (*Menu_action) (void);

Menu_action menujtems [ ] = {fl, f2};

Здесь typedef вводит обозначение Menu_action для типа "указатель на функции с пустым списком параметров, возвращающие значения типа int".