Читайте также:
|
|
Указатель может указывать на функцию (т.е., такой указатель содержит адрес области памяти, в которой хранится код функции). Тип указателя определяется типом возвращаемого значения и типами параметров функции. В следующем примере определен указатель на функцию, которая возвращает 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 |