Студопедия

Главная страница Случайная страница

Разделы сайта

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






Вказівники на функції






Самі функції мови С++ не є змінними, але можна визначити вказівник на функцію, яку можна обробляти, передавати іншим функціям, розміщати в масиви і т. ін. Розглянемо програму, яка при заданні необов’язкового аргументу – n сортує рядки чисельно, а не лексикографічно.

Алгоритм сортування складається із трьох частин – порівняння (впорядковує будь-які пари об’єктів), перестановки (змінює порядок об’єктів) і сортування (розміщується об’єкт у потрібному порядку). Алгоритм сортування не залежить від операцій порівняння і перестановки, тому передача в нього різних функцій порівняння і перестановки дозволяє організувати сортування за різними критеріями. Саме такий підхід і використано в програмі сортування (див. ПП6.26 на СD).

Лексикографічне порівняння рядків здійснюється функцією Strcmp, а перестановка – функцією Swap. Функція Numcmp порівнює два рядки на базі числового значення і повертає той умовний вказівник, що й Strcmp. Ці три функції описано в Main і вказівники на них передаються у Sort. Тут Strcmp, Nimcmp і Swap – адреси функцій. Передача адрес функцій організовується компілятором. Модифікація функції Sort реалізовано в програмі (див. ПП6.27. на СD)

Опис int (* comp)() означає, що comp є вказівником на функцію, яка повертає значення типу int. Перші круглі дужки тут необхідні, оскільки без них опис int *comp () означав би, що comp є функцією, яка повертає вказівник на цілі значення. Використання comp у рядку if (* comp)(v [ j ], v [ j + gap ]) < = 0) повністю відповідає опису, де
comp – вказівник на функцію, *comp – сама функція; (* comp)(v [ j ], v [ j + gap ]) – звернення до фукції.

Функцію Strcmp, яка порівнює два рядки за першим числовим значенням, реалізовано в програмі ПП6.28. (див. на СD). Функція Swap, яка переставляє два вказівними, реалізована в програмі ПП6.29. (див. на СD).

 

У C++ існують наступні види вказівників:

1) вказівник на функцію;

2) вказівник на об'єкт;

3) вказівник на void.

Усі ці вказівники відрізняються властивостями і набором припустимих операцій. Вказівник завжди пов'язаний з яким-небудь конкретним типом.

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

Оголошення вказівника на функцію:

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

Приклад

int (*fn)(float, float) – задає вказівник з ім'ям fn на функцію, що повертає значення типу int і має два аргументи типу float.

Приклад програми

#include < iostream.h>

#include < conio.h>

double fx(double x)

{

double y;

y=x*x;

return y;

}

void print_tab(double (*f)(double), float a, float b, float dx)

{

float x;

for (x=a; x< =b; x+=dx)

cout< < x< < '\t'< < f(x)< < endl;

}

void main()

{

clrscr();

cout< < " Таблиця значень функції" < < endl;

print_tab(fx, 10, 20, 0.5);

}

Дана програма містить функцію для виведення на екран таблиці значень функції в заданому діапазоні. Функція, яка буде табулюватися, передається в цю функцію як параметр.

Вказівник на об'єкт містить адресу області пам'яті, у якій зберігаються дані визначеного типу.

Вказівник на об'єкт має вид:

тип *ім'я;

При цьому тип може бути будь-яким, крім посилання.

Зірочка відноситься безпосередньо до імені, тому при оголошенні декількох вказівників потрібно ставити її перед кожним з них.

Приклад:

int *a, *b; – визначає два вказівники на тип int.

Вказівник на void застосовується тоді, коли не визначений тип об'єкта, адресу якого потрібно зберігати в вказівнику. Вказівнику на void можна присвоїти значення вказівника будь-якого типу, а також порівнювати його з будь-якими вказівниками, але перед виконанням яких-небудь дій з областю пам'яті, на яку він посилається, потрібно перетворити його до конкретного типу явно.

Усі величини типу вказівник підкоряються загальним правилам визначення області дії, видимості і часу життя.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.