Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Указатели на функции часто используют в качестве аргументов функций

Однако предпочтительнее использовать вариант 1.

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

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

Не путать с описанием

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

Иногда под сигнатурой функции подразумевают список типов ее параметров.

Каждая функция характеризуется типом возвращаемого значения, именем и сигнатурой. Сигнатура определяется количеством, порядком следования и типами параметров.

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

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

Например: int(*f1Ptr)(char) определяет указатель f1Ptr на функцию с параметром типа char, возвращающую значение типа int.

int* f1(char);

- это прототип функции с именем f1 и параметром типа сhar, возвращающей значение указателя типа int.

char* (*f2Ptr)(char*, int);

Это определение указателя f2Ptr на функцию с параметрами типа указатель на char и типа int, возвращающую значение типа указатель на char.

#include <iostream>

using namespace std;

void f1 (void)

{cout << "выполняется f1()\n";}

void f2 (void)

{cout << "выполняется f2()\n";}

void main()

{ setlocale(LC_ALL,".1251");

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

ptr=f2; // присваивается адрес f2()

(*ptr)(); // вызов f2 по адресу

ptr=f1; // присваивается адрес f1()

(*ptr)(); // вызов f1 по адресу

ptr(); // вызов эквивалентен (*ptr)();

}

Результат выполнения:

выполняется f2()

выполняется f1()

выполняется f1()

В программе описан указатель ptr на функцию, и ему последовательно присваиваются адреса функций f1 и f2.

Формат вызова функции:

(*имя_указателя)(спиcок_фактических_параметров);

Значением имени_указателя служит адрес функции, а с помощью операции разыменования * обеспечивается обращение по адресу к этой функции. Ошибкой будет обращение

*ptr();

Ибо () имеют более высокий приоритет, чем *.

char f1(char){…} //определение функции

char f2(int){…} //определение функции

void f3(float){…} //определение функции

int* f4(char*){…} //определение функции

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

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

void (*pt3)(float)=f3;

//инициализированный указатель на функцию

pt1=f1; //ош-несоотв сигнатур

pt2=f3; //ош-несоотв типов и сигнатур

pt1=f4; //ош-несоотв типов

pt1=f2; //ok!

pt2=pt1; //ok!

char c=(*pt1)(44);//ok!

c=(*pt2)(’\t’);// ош-несоотв сигнатур

Пример вызова функций с помощью указателей:

 

#include <iostream>

using namespace std;

//функции одного типа с одинаковыми //сигнатурами

int add (int n, int m) {return n+m;}

int divi(int n, int m) {return n/m;}

int mult(int n, int m) {return n*m;}

int subt(int n, int m) {return n-m;}

void main()

{ setlocale(LC_ALL,".1251");

int (*par)(int, int);

// указатель на функцию

int a=6, b=2;

char c='+';

while (c!='0')

{ cout<<"знак операции или 0?\n";

cin>>c;

switch (c)

{case '0': break;

case '+': par=add; break;

case '-': par=subt; break;

case '*': par=mult; break;

case '/': par=divi; break;

default: cout <<

"неверная операция" << endl;

c ='1'; break;

}

if ((c!='1')&&(c!='0'))

cout << a << c << b << "="<< (*par)(a,b)<< endl;

//вызов по адресу

}

}

Вызывается функция по адресу, содержащемуся в указателе par следующим

образом:

(*par)(a,b); (1)

Альтернативная форма вызова через указатель подобна нормальному вызову функции:

par(a,b); (2)

<== предыдущая лекция | следующая лекция ==>
Переместить n-1 дисков с В на С, используя А как вспомогательный | Pc1 не адресует никакого массива символов
Поделиться с друзьями:


Дата добавления: 2013-12-13; Просмотров: 357; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.139 сек.