5

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

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

5 回答 5

4

您可以简单地创建一个函数 ( 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;
}
于 2013-02-20T09:30:56.093 回答
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);
}

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

于 2013-02-20T07:33:51.310 回答
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;
}
于 2013-02-20T08:10:58.170 回答
1

请参阅此函数指针并在Wiki - Function Pointers上阅读,您将知道如何修复您的代码。

于 2013-02-20T07:21:49.870 回答
0

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

当您希望传递的不是经典函数指针,而是一个函数指针,它的参数作为一个“函数指针”传递给另一个函数,我认为这不会起作用。

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

于 2013-02-20T07:35:46.930 回答