Покажчики на функцію

Синтаксис мови С++ дозволяє використовувати покажчик на функцію.

Як відомо, ім’я будь-якої функції являє собою покажчик-константу, що дорівнює адресі початку входження у функцію, тобто адресі її першої машинної команди. Крім констант, можна також описувати покажчики-змінні на функцію у вигляді:

type (*name) (список аргументів);

де type — тип значення, що повертається функцією;*name — ім’я змінної-покажчика на функцію.Покажчики на функцію потрібні в таких випадках:

  • для використання як формальних аргументів у інших функціях;
  • для непрямого виклику інших (резидентних) функцій (програм) початок входу в які записується у відоме місце пам’яті.

Приклад 9.8. Програмно реалізувати обчислення суми та різниці двох чисел з використанням покажчика на функцію для доступу до інших функцій.

/* Р9_8.СРР — использование указателя на функцию для доступа к другимфункциям — difference() і sum() */

#inciude <iostream.h>

#include <conio.h>

int difference (int, int); // прототип функции difference()

int sum(int, int);            // прототип функции sum()

void main ( )

{

int (*fun) (int, int);

int x = 20, у = 5, z;

//присваивание указателю fun адреса функции difference()

fun = difference;

z = fun(x, у);               // вызов функции fun()

cout << "z = " << z << endl;

// присваивание указателю fun адреса функции sum()

fun = sum;

z = fun(x, y);

cout << "z = " << z << endl;

getch();

}

// функция определения разности двух чисел — difference()

int difference(int a, int b)

{ return (a-b); }

// функция определения суммы двух чисел — sum()

int sum(int a, int b)

{ return (a + b); }

Результати обчислень:

z = 15

z = 25

Покажчики на функції, як і звичайні змінні, можна об’єд­нати в масиви. Так, коли функції мають прототипи вигляду:

int god (const void*, const void *);

int chena (const void*, const void *);

int nazv (const void*, const void *);

int avtor (const void*, const void *);

можна описати функцію

int (*fcmp[4]) () {god, chena, nazv, avtor};

У результаті буде створено масив функцій, який матиме звичайний доступ до елементів, тобто:

int і=0;
fcmp [і] (pt1, pt2); — виклик функції god (pt1, pt2)

У цьому випадку, замінивши індекс, можна викликати ін­шу функцію.

Крім повернення результату виконання функцій у вигляді даних за значенням, можливо також здійснити повернення результату за допомогою операцій розіменування<*> чи одержання адреси «&».

Операція розіменування «*» означає, що функція повертає адресу на об’єкт. Функції в такому випадку з’являються як по­кажчики на функцію, тобто у вигляді:

type * fname (список формальних аргументів)

Описані таким способом функції повинні повертати покаж­чик на тип (адресу), наприклад:

char dayweek (int data)

{ static char *weekday[ ] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”} ;

return weekday [data % 7]; }

Тут функція dayweek() одержує значення data, тобто число днів, що пройшли з якоїсь визначеної дати, і повертає день тижня у вигляді покажчика на char, оскільки weekday —це масив покажчиків на char.

При оголошенні функції як покажчика на функцію резуль­тат можна передавати шляхом одержання адреси, тобто ви­користовуючи символ “&”. Така функція буде мати структуру:

type *funame (список формальних аргументів){ static type х;   // тело функции   ……………………   return &x;}

Оскільки значенням покажчика є адреса, то функція може повернути адресу об’єкта того ж типу, що і тип покажчика, який повертається. За необхідності повернення результату функції за посиланням доцільніше використовувати операцію одержання адреси “&” і функцію описувати у вигляді:

type funame (список формальних аргументів)

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *