Студопедия

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

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

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






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






    Самі функції мови С++ не є змінними, але можна визначити вказівник на функцію, яку можна обробляти, передавати іншим функціям, розміщати в масиви і т. ін. Розглянемо програму, яка при заданні необов’язкового аргументу – 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.