Использование указателя на функцию как аргумента
Многие функции (в том числе библиотечные) в качестве аргумента используют указатель на функцию. Это позволяет разрабатывать универсальные функции.
К примеру стандартная библиотечная функция быстрой сортировки qsort использует указатель на функцию сравнения двух аргументов, которая может быть стандартной или пользовательской.
Пример. Демонстрация использования функции алгоритма быстрой сортировки с прототипом в <stdlib.h>:
void qsort (void base, int nelem, int width, int (*fcmp)(const void *elem1, const void *elem2));
- сортирует nelem элементов (объектов) размером width каждый, размещенных в памяти, начиная с указателя base, в соответствии с функцией сравнения (библиотечной или пользователя), задаваемой переменной-указателем fcmp на функцию сравнения с двумя аргументами, которая возвращает значение:
< 0, если *elem1 < *elem2,
= 0, если *elem1 == *elem2,
> 0, если *elem1 > *elem2.
Программа:
#include <stdio.h>
#include <stdlib.h> /* для функции qsort() */
#include <string.h> /* для функции strcmp() */
#include <conio.h>
int compare (const void *a, const void *b); /* прототип функции */
void main (void) /* главная функция */
{ int i;
char list [5][4] = {“cat”, “car”, “cab”, “cap”,”can” }; /* массив обьектов сортировки */
clrscr (); /* очистка экрана */
qsort (list, 5, sizeof(list[0]), compare); /* вызов функции */
puts (“Результаты алгоритма быстрой сортировки:”);
for (i=0; i<5; i++) /* цикл по элементам (строкам) */
printf(“%s\n”, list[i]); /* вывод отсортированных строк */
getch(); /* задержка экрана результатов */
} /* конец функции main() */
int compare (const void *a, const void *b) /* функция сравнения */
{
return (strcmp(a,b)); /* возврат результата сравнения */
}
Результаты программы:
Результаты алгоритма быстрой сортировки:
cab
can
cap
car
cat