Указатели функций - это средство, с помощью которого вы выполняете sh это.
Указатели на функции - это то, что вы используете, если, например, вы хотите передать функцию в функцию сортировки, которая сообщает функции сортировки, как сравнивать два соседних члена. Такая функция сравнения позволяет вам предоставить обобщенную функцию сортировки, которая будет работать с коллекцией любого struct
, поскольку вы можете изменить функцию сравнения для размещения любой структуры.
Рассмотрим следующий код сортировки:
typedef struct node{
void* item;
struct node* next;
} Node;
// Just an ordinary bubble sort
void sort(Node *start, bool greaterThan(void* a, void* b))
{
int swapped, i;
Node *ptr1;
Node *lptr = NULL;
/* Checking for empty list */
if (start == NULL)
return;
do
{
swapped = 0;
ptr1 = start;
while (ptr1->next != lptr)
{
if (greaterThan(ptr1->item, ptr1->next->item))
{
swap(ptr1, ptr1->next);
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
}
while (swapped);
}
// Swap function used above
void swap(Node *a, Node *b)
{
void* temp = a->item;
a->item = b->item;
b->item = temp;
}
Чтобы использовать его, нам просто нужно определить полезную нагрузку для помещения в Node* item
и функцию сортировки, чтобы указать, как упорядочивать элементы:
typedef struct {
int book_id;
char title[50];
char author[50];
char subject[100];
char ISBN[13];
} Book;
// Comparison function.
bool bookGreaterThan(void* left, void* right)
{
Book* a = (Book*)left;
Book* b = (Book*)right;
return strcmp(a->title, b->title) > 0;
}
Наконец, вы отсортировал бы ваш список следующим образом:
// Pass a pointer to the first node in your list, and a function pointer to your comparer.
sort(pointerToMyList, bookGreaterThan);
Полный пример можно найти здесь .
См. также Возможно ли достичь полиморфизма во время выполнения в C