Постановка задачи
Табулирование произвольной функции одного переменного
Присваивание указателей на функцию.
Вторая форма
Первая форма.
Вызов функции через указатезатель на функцию.
Операции с указателями на функцию
С указателями на функцию можно выполнять следующие операции.
1. Вызов функции, на которую установлен указатель.
2. Присваивание однотипных указателей.
3. Указатель можно использовать в качестве формального параметра функции.
4. Функция может возвращать значение, имеющее тип указателя на функцию.
Вначале рассмотрим вызов функции с помощью указателя на функции. Существуют две формы вызова через указатель на функцию.
(*<α>)(<b>)
<α>(<b>)
Здесь α имя указателя на функцию, а b - список фактических параметров вызываемой функции. Первая форма строго следует синтакису языка Си, а во второй форме выполняется автоматическое разыменование указателя на функцию. В качестве примера рассмотрим следующий программный код.
double (*pf)(double) = &sqr;
printf(“%0.4g\n”, (*pf)(3)));
printf(“%0.4g\n”, pf(4));
В результате выполнения первого вызова функции printf() на экране появится число 9, а при выполнении второго вызова функции printf() на экране появится число 16.
Любому указателю на функцию может быть присвоено значение нулевого указателя. Например.
double (*pf)(double);
pf = 0;
Можно присваивать указателю на функцию значение другого однотипного указателя на функцию. Например.
double (*pf1)(double) = sqr;
double (*pf2)(double) = cube;
double (*pf3) (double, double);
pf1 = pf2; //Нормально.Указатели pf1 и pf2 имеют один и тот же
//тип
pf1 = pf3; //Ошибка. Указатели pf1 и pf3 имеют разные типы.
Для иллюстрации использования указателей на функцию в качесте параметров функций рассмотрим два примера
Написать функцию пользователя, предназначенную для табулирования произвольной математической функции одного переменного. Табулирование следует выполнять в “n” равноотстоящих точках, начиная от x = хнач вполоть до x = хкон.
Решение
Программа, предназначенная для демонстрации решения поставленной задачи, состоит из трех файлов:
· Файл bibl.c, который содержит определение функции table(), выполняющей табулирование, и определения табулируемых функций: sqr() и cube() .
· Файл bibl.h, который содержит объявления используемых функций.
· Файл main.c, который содержит тестовую программу.
/*Файл bibl.h */
doublesqr(doublex);
double cube(double x);
/* Объявления других табулируемых функций */
void table(double (*pf)(double x), double xn, double xk,
int n);
/*Файл bibl.c */
#include <stdio.h>
/*
Вычисление квадрата аргумента. Первая из табулируемых
функций.
*/
doublesqr(doublex)
{
return x * x;
}
/*
Вычисление третьей степени аргумента. Вторая из табулируемых
функций
*/
doublecube(doublex)
{
return x * x * x;
}
/* Определения других табулируемых функций*/
/*
Функция,выполняющая табулирование. Через первый параметр
этой функции передается табулируемая функция
*/
void table(double (*pf)(double x), double xn, double xk,
int n)
{
double x, dx;
int i;
printf("%5s%10s%10s\n", "НОМЕР", "АРГУМЕНТ", "ФУНКЦИЯ");
x = xn;
dx = (xk - xn) / (n - 1);
for(i = 1; i <= n; i++)
{
printf("%5d%10.2f%10.2\n", i, x, f(x));
x += dx;
}
}
/*Файл main.c */
#include”bibl.h”
intmain(void)
{
double xn, xn:
int n;
printf(“Количество расчетных точек=”)
scanf(“%d”, &n);
printf(“Начальное значение аргумента=”);
scanf(“%lf”, &xn);
printf(“Конечное значение аргумента=”);
scanf(“%lf”, &xк);
/* Табулирование функции y = x2 */
table(sqr, xn, xk, n);
/* Табулирование функции y = x3 */
table(cube, xn, xk, n);
return0;
}