Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_po_C.doc
Скачиваний:
30
Добавлен:
02.04.2015
Размер:
597.5 Кб
Скачать

17. Указатель на функцию

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

тип_функции(*имя_указателя)(спецификация параметров)

Примеры:

1. intf1(charc){. . . . }//определение функции

int(*ptrf1)(char);//определение указателя на функциюf1

2. char*f2(intk,charc){. . . .}//определение функции

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. Обратиться к такой функции можно следующим образом:

floata=(*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>

typedeffloat(*fptr)(float);//тип – указатель на функцию

floatroot(fptrf,floata,floatb,floate)//решение уравнения методом половинного деления

//уравнение передается с помощью указателя на функцию

{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;

}

18. Ссылки на функцию

Подобно указателю на функцию определяется и ссылка на функцию:

тип_функции(&имя_ссылки)(параметры) инициализирующее_выражение;

Пример.

intf(floata,intb){. . . }//определение функции

int(&fref)(float,int)=f;//определение ссылки

Использование имени функции без параметров и скобок будет восприниматься как адрес функции. Ссылка на функцию является синонимом имени функции. Изменить значение ссылки на функцию нельзя, поэтому более широко используются указатели на функции, а не ссылки.

Пример.

#include <iostream.h>

void f(char c)

{cout<<”\n”<<c;}

void main()

{

void(*pf)(char);//указатель на функцию

void(&rf)(char);//ссылка на функцию

f(‘A’);//вызов по имени

pf=f;//указатель ставится на функцию

(*pf)(‘B’);//вызов с помощью указателя

rf(‘C’);//вызов по ссылке

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]