[英]Can a function pointer be passed as an argument without its parameters?
所以,在stdlib.h中有function qsort,其原型如下;
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
如您所见,它需要一个 function function 指针作为其最后一个参数。
比较 function 定义如下:
int compare(const void *a, const void *b){
return (*(int*)a - *(int*)b);
}
现在当我调用 qsort 时,我只声明 function 指针
int (*cmp)(const void*, const void*) = &compare;
并将cmp
作为最后一个参数传递给 function,以及其他参数。 无需指定 function compare
的参数。
这是我的主要 function
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++;
}
}
我在网上得到了这段代码,只是想不通为什么我不需要将任何参数传递给 function 指针cmp
。
这是因为参数在qsort
function 中传递,您将 function 指针传递到 function 中。 喜欢:
/*
* 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);
}
Function 指针通常不带参数传递,因为大多数时候 function 指针用于完成回调(请参阅https://en.wikipedia.org/wiki.computer )。 如果参数是一起传递的,应该是打算实现惰性求值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.