Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кардаш. 1 курс, 1 семестр, заочка, 28 вариант. Контрольная.doc
Скачиваний:
2
Добавлен:
01.04.2014
Размер:
126.98 Кб
Скачать

Void main( )

{

int(*fst)(int); // указатель на функцию

int sum(int, int, int (*fst)(int)); //прототип функци sum

fst=f3; //fst - адрес входа в f3

printf(“4^3+7^3=%d\n”, sum(4,7,fst));

fst=f5; // fst – адрес входа в f5

printf(“3^5+9^5=%d\n”, sum(3,9,fst));

}

int sum(int m, int n, int(*fp)(int)) // реализация функции sum

{

int y1, y2;

y1=(*fp)(m); //вызов или f3 или f5

y2=(*fp)(n); //вызов или f3 или f5

return y1+y2;

}

/*Имеется много и других вариантов реализации функции sum.

int sum(int m, int n, int(*fst)(int))

{

return fst(m)+fst(n);

} */

Указатели на функцию используются в следующих случаях:

- многие библиотечные функции в качестве аргумента получают указатель на функцию;

- использование указателей на функцию в качестве аргументов позволяет разрабатывать универсальные функции, например, функции численного решения уравнений, численного интегрирования и дифференцирования;

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

Указатели на функции могут быть компонентами структур.

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

/* Описание прототипов функций, точки входов которых будут элементами массива указателей на функции */

float func1( float );

float func2( float );

float func3( float );

float func4( float );

float func5( float ); //массив указателей на функции

float (*fparray[5])(float)={func1, func2, func3, func4, func5};

Доступ к элементам массива fparray выполняется как к обычным элементам массива.

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

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

swap(a, b);

где функция swap определена следующим образом:

void swap(int х, int у) /* НЕВЕРНО */

{

int temp;

temp = х;

x = y;

у = temp;

}

Поскольку swap получает лишь копии переменных a и b, она не может повлиять на переменные a и b той программы, которая к ней обратилась. Чтобы получить желаемый эффект, вызывающей программе надо передать указатели на те значения, которые должны быть изменены:

swap(&a, &b);

Так как оператор & получает адрес переменной, &a есть указатель на a. В самой же функции swap параметры должны быть объявлены как указатели, при этом доступ к значениям параметров будет осуществляться косвенно.

void swap(int *px, int *py) /* перестановка *px и *py */

{

int temp;

temp = *рх;

*рх = *py;

*ру = temp;

}

Графически это выглядит следующим образом: в вызывающей программе:

Аргументы-указатели позволяют функции осуществлять доступ к объектам вызвавшей ее программы и дают возможность изменить эти объекты.