C指针 - 作为参数传递的函数指针

时间:2016-10-25 23:53:30

标签: c pointers function-pointers

问题空间:

我在理解以下最终参数的语法时遇到一些麻烦,这是一个作为参数传递的函数指针:

    qsort(
        (void **) lineptr, 0, nlines - 1,

        /* Can't understand the following syntax */
        (int (*)(void*, void*))(numberic ? numcmp : strcmp)
    );

我还有另一种理解方式:

    int (*fn)(void*, void*);
    if(numeric) {
        fn = numcmp;
    } else {
        fn = strcmp;
    }

它们都会生成编译器错误:warning: assignment from incompatible pointer type

代码:

#include <stdio.h>
#include <string.h>
#include "alloc.h"
#include "line.h"
#include "qsort.h"
#include "numcmp.h"

char *lineptr[MAXLINES];

int main(int argc, char *argv[])
{
    int nlines; /* number of input lines read */
    int numeric = 0;

    if (argc > 1 && strcmp(argv[1], "-n") == 0)
        numeric = 1;

    if((nlines = readlines(lineptr, MAXLINES)) >= 0) {

        /* 
            qsort with custome soring function passed as a parameter
            throught pointers
        */
        int (*fn)(void*, void*);
        if(numeric) {
            fn = numcmp;
        } else {
            fn = strcmp;
        }

        qsort((void **) lineptr, 0, nlines - 1, fn);

        /*
            Alternative: 
            qsort(
                (void **) lineptr, 0, nlines - 1,
                (int (*)(void*, void*))(numberic ? numcmp : strcmp)
            );
        */

        printf("Sorted and tailed:\n");
        writelines(lineptr, nlines);

        return 0;
    } else {
        printf("error: input to big to sort\n");
        return 1;
    }
}

1 个答案:

答案 0 :(得分:0)

它本质上是从三元表达式的结果到函数指针的转换,该函数指针应该是qsort中的相应参数。因此,沿(a)b行,b三元表达式,a函数指针声明。

int (*)(void*, void*)声明一个指向函数的指针,该函数接受两个void *个参数并返回int

关于(*)

的说明
  • 如果删除括号,则会有一个返回指向int的指针的函数。
  • 使用括号,您有一个指向返回int的函数的指针。

发现差异。

有一个很棒的实用工具cdecl可以解释这些声明。这是针对您的情况:

cdecl> explain (int (*)(void*, void*))
cast unknown_name into pointer to function (pointer to void, pointer to  void) returning int

(遗憾的是,当使用三元表达时,它似乎失败了:'坏人物&#39;:&#39;。你必须把那部分搞定。)

cdecl.org在线试用,或在本地安装。

(关于解密C声明的was on Hacker News recently的相关讨论,其中提到了clockwise/spiral rule的替代方案。)