K&R示例中显示的函数指针的用途是什么
在 K&R ANSI C 书中,我偶然发现了一段代码,其中使用了指向函数的指针。我想我理解函数指针背后的想法,但书中给出的例子对我来说没有意义。
该功能是使用快速排序算法对文本行进行排序。快速排序函数的声明如下所示:
void qsort(void *lineptr[], int left, int right, int (*comp)(void *, void *);
到目前为止,这对我来说非常有意义,我们声明了一个函数,其中一个参数是指向具有两个空指针参数的函数 ( comp) 的指针。我假设我们这样做是为了节省内存,而不是复制实际功能。
稍后在 main 中以这种方式使用该函数:
qsort((void **) lineptr, 0, nlines-1, (int (*)(void*, void*))(numeric ? numcmp : strcmp));
这是我有一些问题的地方:
- 为什么被
lineptr强制转换为 (void **) - using 的用途是什么
(numeric ? numcmp : strcmp),是否意味着也可以像这样分配指向函数的指针:int ( * )(void*, void*) numcmp
编辑:lineptr定义如下:char *lineptr[MAXLINES];我假设我们正在void**将其从 char 转换为类型 void 指针
回答
K&R 书籍早于标准化 C,因此当时有效的一些构造不再有效。具体来说,似乎假设任何两种指针类型之间的转换都是有效的。
lineptr是 的数组char *,当在表达式中使用时,该数组将衰减为指向其第一个元素的指针,即char **。因此void **需要强制转换来匹配参数类型,因为只有void *在没有强制转换的情况下才能执行到/从的转换。
表达(numeric ? numcmp : strcmp)是选择一个函数来传递作为comp参数的功能,所以无论是numcmp或strcmp取决于的值numeric。(int (*)(void*, void*))需要强制转换,因为strcmp(并且大概numcmp)具有 type int (*)(const char *, const char *)。
转换为不同的函数指针类型并随后使用转换类型调用函数在标准 C 中是未定义的行为,但在 K&R C 中可能是允许的。