Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-1 Программирование С++ / метод_лб_ пз_Інформатика.doc
Скачиваний:
5
Добавлен:
31.01.2021
Размер:
699.9 Кб
Скачать

5.2.1 Використання покажчиків на функцію

Синтаксис мови С++ дозволяє використовувати покажчик на функцію. Ім'я будь-якої константи  це покажчик – константа, дорівнює адресі початку входу у функцію, тобто адресі її першої машинної команди. Крім констант можна також описувати покажчики - змінні на функцію у вигляді:

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

де type  тип значення, що повертається функцією, ;

name  ім'я змінної - покажчика на функцію.

Покажчики на функцію використовуються в наступних основних випадках :

 при використанні їх як формальні аргументи в інших функціях;

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

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

//P5_1.CPP – використання покажчика на функцію для доступу

// до інших функцій difference( ) і sum( ).

#include < iostream >

using namespace std;

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

int sum ( int, int );

Void main ( )

{

int (*fun) (int, int );

int x = 20, y = 5, z ;

fun = difference ; // Присвоювання адреси одного покажчика - іншому

z = fun (x, y);

cout << "z = " << z << еndl;

fun = sum; // Присвоювання нової адреси покажчика

z = fun (x , y );

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

}

int difference (int a , int b) // Опис функції

{ return (a - b);

}

int sum ( int a, int b )

{ return (a + b);}

Як і звичайні змінні, покажчики на функції можна об'єднати в масиви, наприклад, якщо описати функції, тобто їхні прототипи у вигляді:

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 i =0;

fcmp [i] ( pt1,pt2 ); // це виклик функції god ( pt1, pt2);

Варто звернути увагу, що замінивши індекс, можна викликати іншу функцію і т.д.

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

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

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

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

сhar* dayweek (int data)

{

static char *weekday[ ] = {"Sunday", "Monday", "Tuesday",

"Weduesday", "Thursday", "Friday", "Saturday"}

return weekday [data % 7];

}

Тут функція dayweek одержує значення data, тобто число днів, що пройм

ли з якоїсь визначеної дати, і повертає день тижня у вигляді покажчика на char* оскільки weekday  це масив покажчиків на char , що належить типу char*.

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

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

{

static type x;

// далі виникає тіло функції

return &x;

}

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

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