gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:55:35 25 4
gpt4 key购买 nike

问题空间:

我在理解以下最终参数的语法时遇到了一些困难,该参数是作为参数传递的函数指针:

    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;
}

此外,它们都会生成编译器错误:警告:来自不兼容指针类型的赋值

代码:

#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;
}
}

最佳答案

它本质上是从三元表达式的结果到函数指针的转换,该函数指针应该是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

(遗憾的是,当使用三元表达式时,它似乎会失败:`坏字符':'。您必须弥补该部分。)

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

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

关于C 指针 - 作为参数传递的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40251555/

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