我有一个功能,我想通过各种功能
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;
}
答案 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?