Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Указатели на функции

Читайте также:
  1. Ii) Указатели на элементы массива
  2. III. B. Функции слова ONE
  3. Other Functions of Money. Другие функции денег
  4. V) Массивы и функции
  5. Абстрактные базовые классы и чисто виртуальные функции
  6. Абстрактные базовые классы и чисто виртуальные функции.
  7. Аппроксимация 1s –функции электрона в атоме водорода двумя гауссовыми функциями

 

Указатель может указывать на функцию (т.е., такой указатель содержит адрес области памяти, в которой хранится код функции). Тип указателя определяется типом возвращаемого значения и типами параметров функции. В следующем примере определен указатель на функцию, которая возвращает int и принимает как параметры две переменные: int и указатель на float:

 

int (* func_ptr) (int, float *); // указатель

 

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

 

typedef int (* func_ptr_type) (int, float *);

//объявляется тип под названием func_ptr_type (псевдоним)

func_ptr_type p, q; //объявлены два указателя на этот тип

Напомним, что имя, объявленное со спецификатором typedef (typedef-директивой) становится typedef -именем, которое внутри области действия этого объявления синтаксичечки эквивалентно ключевому слову, именующему тип ассоциированного с ним идентификатора. Внутри некоторой области действия, спецификатор typedef может быть использован для переопределения имени любого типа, объявленного в данной области, для ссылки на уже существующий тип (typedef int I;, например).

 

Если у нас определена функция:

 

int a_function (int i, float * p) {…},

 

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

 

p = a_function; // имя функции считается адресом

 

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

 

int n = p(2, f_array);

// call function a_function with parameter int 2

// and an array of float f_array

 

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

 

Пример

 

#include <iostream.h>

void sum(int a, int b)

{ cout << "The sum of " << a << " and " << b << " is " << (a + b); }

void dif(int a, int b)

{ cout << "The difference of " << a << " and " << b << " is " << (a - b); }

void calculate(int x, int y, void (* formal_fp)(int, int))

{ formal_fp(x, y); }

int main()

{

void (*fp)(int, int);

int x, y, flag = 1;

char choice;

cout << "Please enter two integers, separated by a blank.\n";

cin >> x >> y;

while (flag)

{

cout << "Press s to find the sum, or d to find the difference.\n";

cin >> choice;

 

if (choice == 's')

{

fp = sum;

calculate(x, y, fp);

// pass a pointer to function as a parameter

flag = 0;

}

else if (choice == 'd')

{

calculate(x, y, dif);

// pass the function itself as a parameter

flag = 0;

}

else

{ cout << "Wrong choice.\n"; }

}

return 0;

}

 

Массивы указателей на функции определяются аналогично.Следующее определение - массив из трех указателей на функции, которые возврвщают int и воспринимает параметр типа char *:

 

int (*fp_array[3])(char*);

 

После инициализации массива, если нужно вызвать вторую функцию с параметром char_ptr, то мы пишем обращение

 

fp_array[1](char_ptr);

//========================

à Замечание о синтаксисе. Вы, наверное, обратили внимание как часто мы говорим об указателях. Указатели как механизм в С++ “эксплуатируются” очень интенсивно. Поэтому приведем еще несколько примеров, касающихся описания указателей:

int **ptr; //указатель на указатель на тип int

int *risks[10]; //10-элементный массив указателей на тип int

int (*wisks) [10]; //указатель на 10-элементный массив типа int

int *oof[3] [4]; // 3-элементный массив указателей на 4-элементный массив типа int

int (*uuf) [3] [4]; //указатель на массив 3*4 типа int

char *flump () [3]; // функция, возвращающая указатель на 3-элементный массив

// типа char

Правило для чтения и написания подобных конструкций.

Если *, () и [] назвать модификаторами, то правило такое:

· Чем ближе модификатор стоит к идентификатору, тем выше его приоритет.

· Модификаторы [] и () имеют приоритет выше, чем *.

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

ß

 


Дата добавления: 2015-11-16; просмотров: 65 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Рекурсивные Функции| Директива #define

mybiblioteka.su - 2015-2024 год. (0.009 сек.)