微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

函数指针可以作为参数传递而不带参数吗?

如何解决函数指针可以作为参数传递而不带参数吗?

所以,stdlib.h中有qsort函数,其原型如下;

void qsort (void* base,size_t num,size_t size,int (*compar)(const void*,const void*));

如你所见,它需要一个函数函数指针作为它的最后一个参数。

compare 函数定义如下:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。