КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Указатель на функциюКаждая функция характеризуется типом возвращаемого значения, именем и списком типов ее параметров. Если имя функции использовать без последующих скобок и параметров, то он будет выступать в качестве указателя на эту функцию, и его значением будет выступать адрес размещения функции в памяти. Это значение можно будет присвоить другому указателю. Тогда этот новый указатель можно будет использовать для вызова функции. Указатель на функцию определяется следующим образом: тип_функции(*имя_указателя)(спецификация параметров) Примеры: 1. int f1(char c){. . . . }//определение функции int(*ptrf1)(char);//определение указателя на функцию f1 2. char*f2(int k,char c){. . . .}//определение функции char*ptrf2(int,char);//определение указателя В определении указателя количество и тип параметров должны совпадать с соответствующими типами в определении функции, на которую ставится указатель. Вызов функции с помощью указателя имеет вид: (*имя_указателя)(список фактических параметров); Пример. #include <iostream.h> void f1() {cout<<”\nfunction f1”;} void f2() {cout<<”\nfunction f2”;} void main() { void(*ptr)();//указатель на функцию ptr=f2;//указателю присваивается адрес функции f2 (*ptr)();//вызов функции f2 ptr=f1;//указателю присваивается адрес функции f1 (*ptr)();//вызов функции f1с помощью указателя } При определении указатель на функцию может быть сразу проинициализирован. void (*ptr)()=f1; Указатели н функции могут быть объединены в массивы. Например, float(*ptrMas[4])(char) – описание массива, который содержит 4 указателя на функции. Каждая функция имеет параметр типа char и возвращает значение типа float. Обратиться к такой функции можно следующим образом: float a=(*ptrMas[1])(‘f’);//обращение ко второй функции Пример. #include <iostream.h> #include <stdlib.h> Void f1() {cout<<"\nThe end of work";exit(0);} Void f2() {cout<<"\nThe work #1";} Void f3() {cout<<"\nThe work #2";} Void main() { void(*fptr[])()={f1,f2,f3}; Int n; while(1)//бесконечный цикл { cout<<"\n Enter the number"; cin>>n; fptr[n]();//вызов функции с номером n } } Указатели на функции удобно использовать в тех случаях, когда функцию надо передать в другую функцию как параметр. Пример. #include <iostream.h> #include <math.h> typedef float(*fptr)(float);//тип – указатель на функцию float root(fptr f, float a, float b, float e)//решение уравнения методом половинного деления //уравнение передается с помощью указателя на функцию {float x; do { x=(a+b)/2; if ((*f)(a)*f(x)<0)b=x; else a=x; } while((*f)(x)>e&&fabs(a-b)>e); return x; } float testf(float x) {return x*x-1;} void main() { float res=root(testf,0,2,0.0001); cout<<”\nX=”<<res; }
|