我正在尝试练习指向函数的指针,但我不理解使用的技术。
上下文:
char *lineptr[5000];
int strcmp (char *, char *);
int numcmp (char *, char *);`
函数原型是:
void qsort ( void *lineptr[], int left, int right, int (*comp)(void *, void *));
我不明白以下通话是如何运作的:
qsort((void**)lineptr ,0 , nlines-1, (int(*)(void*,void*))(numeric?numcmp:strcmp));
特别是这部分:
(int (*)(void*, void*))(numeric ? numcmp : strcmp)
函数原型只有4个参数,而在函数调用中,有5个参数,第5个是方程式。这个编译没有错误。
有一次,我假设它会根据numcomp
的值为函数指针strcmp
分配(*comp)
或numeric
。但我不明白的是这项任务将如何发生。
答案 0 :(得分:4)
只传递4个参数,第4个参数
(int (*)(void*, void*))(numeric ? numcmp : strcmp)
将传递指向numcmp
的指针(如果numeric
是真实的)或指向strcmp
函数的指针(如果numeric
是假的)。
(int (*)(void*, void*))
只是对函数签名的强制转换,以帮助编译器,因为编译器期望(int (*)(void*, void*))
作为函数指针(参见qsort
函数原型)并且你是传入指向numcmp/strcmp
(int (*)(char*, char*))
的指针。
答案 1 :(得分:2)
只有4个参数:
qsort((void**)lineptr,0,nlines-1,(int(*)(void*,void*))(numeric?numcmp:strcmp));
分解为每行一行,看起来像:
qsort((void**)lineptr,
0,
nlines-1,
(int(*)(void*,void*))(numeric?numcmp:strcmp));
最后一个似乎是令你困惑的那一个。 ?:
表达式选择具有相同声明类型的两个函数之一:
numeric?numcmp:strcmp
然后将其括起来(用于优先级)并转换为带有两个void *
参数的函数指针类型:
(int(*)(void*,void*))funcptr
强制转换操作符中的类型是一个指向函数的指针,该函数接受两个void *
参数并返回int
结果。
答案 2 :(得分:0)
qsort
的最后一个参数有点复杂。
qsort((void**)lineptr,0,nlines-1,(int(*)(void*,void*))(numeric?numcmp:strcmp));
// |<-- one argument -->
以更详细的代码为代价,您可以将该行简化为
int(*compare_function)(void*,void*) = (int(*)(void*,void*))numcmp;
if ( !numeric )
{
compare_function = (int(*)(void*,void*))strcmp;
}
qsort((void**)lineptr,0,nlines-1, compare_function);