调用函数指针(语法)

时间:2015-11-19 00:44:12

标签: c function pointers struct

假设我有一个接受这些参数的函数。

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指针,因为它是通用构建)。

3 个答案:

答案 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);
}