gpt4 book ai didi

c - K&R 示例中显示的函数指针的用途是什么

转载 作者:行者123 更新时间:2023-12-03 18:39:32 26 4
gpt4 key购买 nike

在 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 **)
  • 使用 (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 参数传递给函数,因此 numcmpstrcmp 取决于 numeric 的值。需要转换为 (int (*)(void*, void*)) ,因为 strcmp (大概是 numcmp )的类型是 int (*)(const char *, const char *)
    转换为不同的函数指针类型并随后使用转换类型调用函数在标准 C 中是 undefined behavior,但它可能在 K&R C 中被允许。

    关于c - K&R 示例中显示的函数指针的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65425350/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com