【发布时间】:2021-02-14 13:45:52
【问题描述】:
所以,stdlib.h中有qsort函数,其原型如下;
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
如您所见,它需要一个函数函数指针作为其最后一个参数。
比较函数定义如下:
int compare(const void *a, const void *b){
return (*(int*)a - *(int*)b);
}
现在当我调用 qsort 时,我只需要声明函数指针
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。
【问题讨论】:
-
您不需要将任何参数传递给
cmp(),因为您没有调用它。它是从qsort()函数中调用的。顺便说一句,您可以将compare作为调用qsort()的最后一个参数。无需为此目的声明另一个变量。 -
@Aman Jain 参数未传递。参数是声明。传递的是参数。并且函数 qsort 在内部将两个类型为 const void *. 的指针传递给您的函数
-
@AmanJain 它根据它的算法实现来做到这一点。
-
好的,如果我将函数的参数类型更改为整数,它仍然有效吗?
-
qsort 的第四个参数是 qsort 将调用来比较两个值的函数。在比较中添加一个
printf来描述它被调用的参数可能是有教育意义的,这样您就可以跟踪操作。
标签: c function-pointers