首页 > 解决方案 > 可以将函数指针作为不带参数的参数传递吗?

问题描述

因此,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

标签: cfunction-pointers

解决方案


那是因为参数是在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))。如果参数是一起传递的,应该是打算实现惰性求值


推荐阅读