Покажчики на функції 1
Покажчики на функції
У цьому прикладі ми створили функцію відображення, яка застосовує до всіх елементів масиву функцію, яка передається їй як аргумент. Коли ми викликаємо функцію map, досить просто передавати імена функцій (вони підміняються покажчиками). Запишемо тепер функцію map, яка отримує в якості аргументу масив типу void:
Ось де нам знадобилися покажчики типу void. Так як map отримує покажчик на функцію, то всі функції повинні мати однакові аргументи і повертати один і той же тип. Але аргументи функцій повинні бути різного типу, тому ми робимо їх типу void. Функція map отримує покажчик типу void (*) (void *), тому їй тепер можна передавати будь-яку з чотирьох функцій.
Приклад іншої функції: функція filter отримує покажчик на масив і повертає розмір нового масиву, залишаючи в ньому тільки ті елементи, для яких переданий предикат повертає логічну істину (предикат - функція, яка повертає істину або брехня). Спочатку напишемо для масиву типу int:
Тепер для масиву типу void
Ще одна функція - згортка. Вона отримує в якості аргументів масив і функцію від двох аргументів. Ця функція діє таким чином: спочатку вона застосовується до перших двох аргументів, потім вона застосовується до третього аргументу і результату попереднього виклику, потім до четвертого аргументу і результату попереднього виклику і т.д. За допомогою згортки можна, наприклад, знайти суму всіх елементів масиву, максимальний елемент масиву, факторіал числа і т.п.
Останній приклад: функція сортування вставками для масиву типу void. Так як тип масиву не відомий, то необхідно передавати функцію порівняння.
Масив покажчиків на функції
М ассів покажчиків на функції визначається так само, як і звичайний масив - за допомогою квадратних дужок після імені:
Точно також можна було створити масив динамічно
Часто покажчики на функцію стають громіздкими. Роботу з ними можна спростити, якщо ввести новий тип. Попередній приклад можна переписати так
Ще один приклад: функція any повертає 1, якщо в переданому масиві міститься хоча б один елемент, що задовольняє умові pred і 0 в іншому випадку.
qsort і bsearch
У бібліотеці stdlib сі є кілька функцій, які отримують в якості аргументів покажчики на функції. Функція qsort отримує такі ж аргументи, як і написана нами функція insertionSort: масив типу void, розмір масиву, розмір елемента і покажчик на функцію порівняння. Давайте подивимося простий приклад - сортування масиву рядків:
Функція bsearch проводить бінарний пошук в відсортованому масиві і отримує покажчик на функцію порівняння, таку ж, як і функція qsort. У разі, якщо елемент знайдений, то вона повертає покажчик на цей елемент, якщо елемент не знайдений, то NULL.
ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 [email protected] Stepan Sypachev students
Все ще не зрозуміло? - пиши питання на ящик