繁体   English   中英

function 指针可以作为不带参数的参数传递吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM