Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
    1. Указатели на функцию

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

      1. Определение понятия указатель на функцию

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

      1. Классификация указателей на функцию

В языке Си существуют две разновидности указателей на функцию:

  • указатель – выражение,

  • указатель переменная.

      1. Указатель – выражение

Как было отмечено выше, указателем выражение является выражение, значением которого является адрес функции. Приведем пример.

Пусть имеется прототип функции для вычисления квадрата числа типа double. Тогда выражение &sqr- это выражение – указатель. Здесь & - унарный оператор взятия адреса, который и предписывает компилятору вычислить адрес йункции.

      1. Указатель – переменная

Указатель - переменная это переменная, предназначенная для хранения адреса функции. Рассмотрим формат определения такой переменной.

<> (* <α>) (<γ>)

  • * - оператор разыменования,

α– идентификатор, объявленного указателя,

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

  • γ– список типов параметров функции, на которую может быть установлен указатель.

Приведем пример объявления указателя – переменной.

double(*pf)(double);

Это объявление переменной. Имя переменной pf. значением этой переменной может служить адрес любой функции, которая принимает один параметр типаdoubleи которая возращает значения типаdouble.

Учитывая изложенное выше, можно сказать, что определение указателя на функцию задает множество функций, с которыми он может использоваться. Указатель – переменная pf, объявленная выше, может работать, например, со следующими функциями.

double sqr(double x) {

return x * x;

}

double cube(double x) {

return x * x * x;

}

Вернемся к объявлению указателя – переменной pf. Рассмотрим вопрос о назначении используемых в нем скобок. Здесь их две пары.

double(*pf)(double);

Вторая пара скобок – это оператор функция. Возникает вопрос: «Какую роль играет первая пара скобок?». С целью разобраться в этом вопросе на время удалим эту пару скобок. Тогда рассматриваемое выражение примет следующий вид.

double*pf(double);

Полученное выражение является объявлением функции, которая принимает один параметр типа doubleи возращает указатель типаdouble*. Для того чтобы убедиться в этом вспомним, что в синтаксис объявлений в языке Си заложен синтаксис выражений. Для определения назначения имениpfв рассматриваемом выражении следует рассмотреть подвыражение *pf(double). Здесь к имениpfприменяются два оператора: * и () . Трактовка имениpfзависит от приоритетов этих операторов. Если обратиться к таблице приоритетов операторов, то можно убедиться в том, что оператор функция () имеет более высокий приоритет по сравнению с оператором разыменования *. Отсюда следует, что оператор () сильнее связывает имяpfпо сравнению с оператором *. Итак, в новой редакцииpfявляется именем функции, а не именем указателя.

Вернемся теперь к исходному объявленияю

double(*pf)(double);

Первые скобки в этом выражении слияют на порядок группирововки операторов и операндов. Теперь имя pf становится именем указателя.