假设我有一个接受这些参数的函数。
int create(Ptr * p,void * (*insert)(void *, void *)) {
//return something later
}
结构:
typedef struct {
void ** ptr;
void * (*insert)(void *, void *));
}Ptr;
其中p是指向结构的指针,insert是一个带有两个通用指针(void指针)的函数的函数指针,在给定的树中插入一个整数(我使用的是void指针,因为在这种情况下它是一个整数,在其他情况下可能不是)。
我如何在这里调用函数create?
我知道我可以为第一个参数做一些事情:
//在单独的.c文件中
Ptr * pt;
pt = malloc(sizeof(Ptr));
create(pt,....what to put here)?
如果我想将结构指针作为参数传递,并且要插入第二个整数(同样,它们都是void指针,因为它是通用构建)。
答案 0 :(得分:1)
在该功能中,你可以写下:
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…
答案 1 :(得分:0)
根据create ...
的定义void* mine(void* x, void* y)
{
return NULL
}
create(pt, mine);
并创建
int create(Ptr * p,void * (*insert)(void *, void *)) {
p->insert = insert;
}
我还会使用函数进行调用
void* ptr_insert(Ptr* p, void* a, void* b)
{
if(p!=NULL && p->insert != NULL) return p->insert(a,b);
return NULL;
}
答案 2 :(得分:0)
一些可编译的示例用法:
typedef struct {
void ** ptr;
void * (*insert)(void *, void *);
} Ptr;
int create(Ptr * p,void * (*insert)(void *, void *));
void* Insert(void*, void*);
void fun(){
Ptr ptr;
Ptr * pt = &ptr;
//Function name decays to its addresss
create(pt, &Insert);
create(pt, Insert); //the same thing
//Declare a pointer
void* (*ins)(void*, void*);
//Assing to it
ins = &Insert;
//Same thing
ins = Insert;
//Invocation via pointer
void* ret = (*ins)(pt, pt);
//Same thing
ret = ins(pt, pt);
//Passs the pointer
create(pt, ins);
}