使用函数指针的另一种方法是将其作为参数传递给另一个函数。
用作参数的函数指针有时被称为回调函数,因为接收函数“将其回调”。
stdlib.h头文件中的qsort()函数使用此技术。
快速排序是一种广泛使用的数组排序算法。要在程序中实现排序,只需包含stdlib.h文件,然后编写与qsort中使用的声明匹配的比较函数:
void qsort(void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
要分解qsort声明:
void*base 将指向数组的void指针size_t num数组中的元素数。
size_t width元素的大小。
int(*compare(const void*,const void*)具有两个参数的函数指针,当参数具有相同的值时返回0;当arg1小于arg2返回-1;当arg1大于arg2返回1。
比较函数的实际实现取决于您。它甚至不需要名字“比较”。您可以指定从高到低或从低到高的排序,或者如果数组包含结构元素,则可以比较成员值。
以下程序使用qsort将一个int数组从低到高排序:
#include <stdio.h> #include <stdlib.h> int compare (const void *, const void *); int main() { int arr[5] = {52, 23, 56, 19, 4}; int num, width, i; num = sizeof(arr)/sizeof(arr[0]); width = sizeof(arr[0]); qsort((void *)arr, num, width, compare); for (i = 0; i < 5; i++) printf("%d ", arr[ i ]); return 0; } int compare (const void *elem1, const void *elem2) { if ((*(int *)elem1) == (*(int *)elem2)) return 0; else if ((*(int *)elem1) < (*(int *)elem2)) return -1; else return 1; }
我们在qsort调用中使用函数名,因为函数名充当指针。