假设我有一个接受这些参数的函数。
int create(Ptr * p,void * (*insert)(void *, void *)) {
//return something later
}
结构:
typedef struct {
void ** ptr;
void * (*insert)(void *, void *));
}Ptr;
其中 p 是指向结构的指针,insert 是指向具有两个通用指针(空指针)的函数的函数指针,用于在给定树中插入整数(我使用空指针,因为在本例中它是一个整数,在其他情况下可能不是)。
我该如何在这里调用函数create?
我知道我可以对第一个参数做一些类似的事情:
//在单独的.c文件中
Ptr * pt;
pt = malloc(sizeof(Ptr));
create(pt,....what to put here)?
如果我想传递结构指针作为参数,然后传递一个要插入的整数(同样,它们都是空指针,因为它是通用构建)。
最佳答案
在该函数内,您可以编写以下任一内容:
insert(vp1, vp2);
或者:
(*insert)(vp1, vp2);
我假设:
void *vp1 = …;
void *vp2 = …;
第二种是C89/C90标准之前必需的形式;你会发现像我这样的老顽固仍然更喜欢它。第一个是自标准的第一个版本发布以来的标准,但是您必须查看函数的参数列表才能发现 insert
是指向函数的指针而不是函数的名称。这就是为什么我仍然更喜欢旧的表示法。
要实际调用该函数,您只需提供与 insert
函数指针的签名相匹配的函数名称即可:
extern void *insert_int(void *vp1, void *vp2);
if (create(pt, insert_int) != 0)
…handle error…
关于调用函数指针(语法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793321/