传递带有变量参数的函数作为void指针,并调用它

时间:2013-02-20 07:01:48

标签: c pointers

我有一个功能,我想通过各种功能

int func1(char *ptr)
{
    printf("%s",ptr);
    return 0;
}

以及我想调用func1的其他函数

int func2(void *i)
{
    //call i
    //here i point to function func1
    //and do something with return value of i
}

那么,我应该如何在main()中调用它?

int main()
{
    void *d;
    //SOMETHING wrong in next four line
    d=&func1("abcd");
    func2(d);
    d=&func1("xyz");
    func2(d);
    return 0;
}

5 个答案:

答案 0 :(得分:3)

您可以简单地创建一个函数(func2),该函数将一个函数指针指向您想要调用的函数,另一个参数指向您的字符串。然后在func2中使用str参数调用传入的函数指针。

#include <stdio.h>

void func1(const char *str)
{
    puts(str);
}

void func2(void (*fp)(const char *), const char *str)
{
    fp(str);
}

int main(void)
{
    const char *str = "Hello world.";

    func2(func1, str);

    return 0;
}

答案 1 :(得分:2)

首先应该使用函数指针来完成你想要的工作。使用void指针是一种方法,您可以事先了解要将其转换为解除引用的内容。由于您传递的是函数的地址,因此无论如何都应该将它转换为函数指针。所以避免所有这些,并反正声明func指针。如果您知道可以处理所有可能性,请使用void * 。例如。 memcpy使用void *这是可以接受的,因为您只想将源位置中的一堆数据复制到目标位置。

#include <stdio.h>
void func1(char * str)
{
   printf("%s",str);
}
void func2(void * g)
{
   void (*p) (char *);   //function pointer
   p = (void (*)(char *))g;//casting void * to pi.e func pointer reqiuired eitherways.
   p("Func pointer caller");
}
void main()
{
   void * d = func1; // name of the function is itselt its address
   //printf("func1 = %d\nd = %d",func1,d);  
   func2(d);
}

所有这些都可以通过一个简单的函数指针来避免。

答案 2 :(得分:2)

首先:函数指针仅指一个函数。调用函数时,参数直接或通过函数指针进入游戏。

因此,如果您想实现您的想法,那就是将(一组)参数绑定到特定函数变量,您需要使用包装函数:

int func1(char * pc)
{
  int i;
  /* assigne somehting to "i" and use "pc" */
  return i;
}

int func1_abcd(void)
{
  return func1("abcd")
}

int func1_xyz(void)
{
  return func1("xyz")
}

typedef int (*pfunc1_wrapper_t)(void);

int func2(pfunc1_wrapper_t pfunc1_wrapper)
{
  return pfunc1_wrapper();
}

int main(int argc, char ** argv)
{
  pfunc1_wrapper_t pfunc1_wrapper = NULL;
  int i = 0;

  pfunc1_wrapper = func1_abcd;
  i = func2(pfunc1_wrapper);

  pfunc1_wrapper = func1_xyz;
  i = func2(pfunc1_wrapper);

  ...

  return 0;
}

答案 3 :(得分:1)

请参阅此Function pointers并阅读Wiki - Function Pointers,您就会知道如何修复代码。

答案 4 :(得分:0)

Jatin已经发布了函数指针的一般链接,非常好解释函数指针。

当你想要传递的不是经典函数指针,而是函数指针将它的参数作为一个“函数指针”传递给另一个函数时,我认为这不会起作用。

但为什么将一个带有参数的函数作为一个参数传递?这意味着,您使用参数传递的函数将仅返回一个结果,该结果已在func2之外已知(因为func2将使用此已定义的外部参数集调用func1)。那么为什么不直接将func1调用的结果传递给func2?