问题描述
所以,stdlib.h中有qsort函数,其原型如下;
void qsort (void* base,size_t num,size_t size,int (*compar)(const void*,const void*));
compare 函数定义如下:
int compare(const void *a,const void *b){
return (*(int*)a - *(int*)b);
}
int (*cmp)(const void*,const void*) = &compare;
并将 cmp
作为函数的最后一个参数与其他参数一起传递。无需指定函数compare
的参数。
这是我的主要功能
main(){
int (*cmp) (const void*,const void*);
cmp = &compare;
int iarray[] = {1,2,3,4,5,6,7,8,9};
qsort(iarray,sizeof(iarray)/sizeof(*iarray),sizeof(*iarray),cmp);
int c = 0;
while (c < sizeof(iarray)/sizeof(*iarray)){
printf("%d \t",iarray[c]);
c++;
}
}
我在网上得到了这段代码,但不明白为什么我不需要将任何参数传递给函数指针 cmp
。
解决方法
那是因为参数是在 qsort
函数内传递的,该函数是您将函数指针传递给的函数。喜欢:
/*
* qsort.c
*
* This is actually combsort. It's an O(n log n) algorithm with
* simplicity/small code size being its main virtue.
*/
...
void qsort(void *base,size_t nmemb,size_t size,int (*compar) (const void *,const void *))
{
size_t gap = nmemb;
size_t i,j;
char *p1,*p2;
int swapped;
if (!nmemb)
return;
do {
gap = newgap(gap);
swapped = 0;
for (i = 0,p1 = base; i < nmemb - gap; i++,p1 += size) {
j = i + gap;
if (compar(p1,p2 = (char *)base + j * size) > 0) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// here calls the compare function
//
memswap(p1,p2,size);
swapped = 1;
}
}
} while (gap > 1 || swapped);
}
函数指针通常不带参数传递,因为大多数时候函数指针用于完成回调(参见https://en.wikipedia.org/wiki/Callback_(computer_programming))。如果参数一起传递,应该是为了实现惰性求值。