c - 可以将函数指针作为不带参数的参数传递吗?
问题描述
因此,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
。
解决方案
那是因为参数是在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))。如果参数是一起传递的,应该是打算实现惰性求值。
推荐阅读
- javascript - 如何让滚动条在 React 页面加载时的某个位置开始
- android - 有没有什么有效的方法可以使用 Android Studio 模拟器测试华为商店的应用程序?
- javascript - 如何让 puppeteer 探索页面上的链接,直到找到登录表单?
- php - 无法使用 curl / php 获取公共 Linkedin 公司页面
- php - 在 Eloquent Laravel 中使用 join 后总和不正确
- python - TensorFlow 中的跟踪
- haskell - 列出 Haskell 类型的构造函数名称?
- python - Kivy:如何在 recycleview 中正确地调整标签
- django - Django DRF PUT 请求 ImageField
- javascript - 如何在单击反应中的另一个按钮时触发打开选择表单的选项?我试过使用 ref 但它不起作用