Использование указателя на функцию как аргумента

 

Многие функции (в том числе библиотечные) в качестве аргумента используют указатель на функцию. Это позволяет разрабатывать универсальные функции.

К примеру стандартная библиотечная функция быстрой сортировки 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