Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 6:

Тип указатель: указатели на функции

< Лекция 5 || Лекция 6: 123 || Лекция 7 >

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

Пример 3: Вычислите приближенное значение интегралов с помощью формулы прямоугольников, задав пределы интегрирования [a, b] и число интервалов разбиения (N): \int\limits_a^b \frac{xdx}{(x^2+1)^2} и \int\limits_a^b 4\cos^2 xdx.

#include "stdafx.h"
#include <iostream>
using namespace std;
//Объявление (прототипы) функций:
/*функция rectangle() возвращает значение типа double, ее параметры:*/
/*pf–указатель на функцию с параметром типа double, возвращающую значение double*/
/*a, b – пределы интегрирования, величины типа double*/
double rectangle(double(*pf)(double), double a, double b);

/*функция ratio() возвращает значение типа double, ее параметр типа double*/
double ratio(double x);

/*функция cos4_2() возвращает значение типа double, ее параметр типа double*/
double cos4_2(double v);

int _tmain(int argc, _TCHAR* argv[]){
  double a,b,c;
  printf("\nВведите значения пределов интегрирования:");
  printf("\na= ");
  scanf("%lf",&a);
  printf("\nb= ");
  scanf("%lf",&b);
  c=rectangle(ratio,a,b);
  printf("Первый интеграл = %f\n",c);
  printf("Второй интеграл = %f\n",rectangle(cos4_2,a,b));
  system("pause");
  return 0;
}

double rectangle(double(*pf)(double), double a, double b){
/*Вычисление определенного интеграла с помощью формулы прямоугольников*/
  int N, i;
  double h,s=0.0;
  printf("\nВведите количество интервалов разбиения: N= ");
  scanf("%d",&N);
  printf("\na= ");
  h=(b-a)/N;  //Длина интервала разбиения
  for (i=0;i<N;i++)
    s+=pf(a+h/2+i*h);
  return h*s;
}            

double ratio(double x) { //Подынтегральная функция
  double z; //Вспомогательная переменная
  z=x*x+1;
  return x/(z*z);
}

double cos4_2(double v){ //Подынтегральная функция
  double w; //Вспомогательная переменная
  w=cos(v);
  return 4*w*w;
}

Ключевые термины

Адрес функции – это адрес памяти, с которого начинается машинный код функции.

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

Указатели на функции как параметры функции – это параметры функции, типы которых определены как указатели на функции.

Указатель на функцию – это переменная, которая содержит адрес этой функции.

Краткие итоги

  1. Адресация функций осуществляется по первому байту расположения машинного кода функции в памяти.
  2. Инициализированный указатель на функцию содержит адрес этой функции.
  3. Арифметические операции над указателями на функции запрещены в силу их внутреннего представления.
  4. При описании указателя на функцию необходимо соблюдать приоритет операций. Разыменование имеет низкий приоритет, поэтому порядок действий определяется круглыми скобками.
  5. При описании указателя на функцию в качестве параметров можно указывать пустой список или список типов параметров.
  6. При вызове функции через указатель необходимо, чтобы типы и набор фактических параметров совпадали с прототипом адресуемой функции.
  7. Функции можно передавать в качестве параметров функций.
  8. Указатели на функции и указатели как параметры функции имеют широкое практическое применение в программировании.
< Лекция 5 || Лекция 6: 123 || Лекция 7 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!