假设我有这三个功能:
bool A();
bool B();
bool C();
如何使用函数指针有条件地调用其中一个函数,如何声明函数指针?
答案 0 :(得分:34)
您可以执行以下操作: 假设你有A,B和B C的功能如下:
bool A()
{
.....
}
bool B()
{
.....
}
bool C()
{
.....
}
现在处于其他一些功能,比如在main:
int main()
{
bool (*choice) ();
// now if there is if-else statement for making "choice" to
// point at a particular function then proceed as following
if ( x == 1 )
choice = A;
else if ( x == 2 )
choice = B;
else
choice = C;
if(choice())
printf("Success\n");
else
printf("Failure\n");
.........
.........
}
记住这是函数指针的一个例子。还有其他几种方法,你必须清楚地学习功能指针。
答案 1 :(得分:20)
声明你的函数指针如下:
bool (*f)();
f = A;
f();
答案 2 :(得分:14)
最初定义一个函数指针数组,它取一个void并返回一个void。 假设你的函数正在取消空白并返回空白。
typedef void (*func_ptr)(void);
现在你可以用它来创建这些函数的函数指针变量。 如下所示:
func_ptr array_of_fun_ptr[3];
现在将函数的地址存储在三个变量中。
array_of_fun_ptr[0]= &A;
array_of_fun_ptr[1]= &B;
array_of_fun_ptr[2]= &C;
现在你可以使用函数指针调用这些函数,如下所示:
some_a=(*(array_of_fun_ptr[0]))();
some_b=(*(array_of_fun_ptr[1]))();
some_c=(*(array_of_fun_ptr[2]))();
答案 3 :(得分:14)
我认为你的问题已经得到了充分的回答,但明确指出给定一个函数指针可能是有用的
void (*pf)(int foo, int bar);
两个电话
pf(1, 0);
(*pf)(1, 0);
根据定义,完全等同于各方面。选择哪个使用取决于您,尽管保持一致是个好主意。很长一段时间,我更喜欢(*pf)(1, 0)
,因为在我看来它更好地反映了pf
的类型,但是在过去的几年里,我已经切换到pf(1, 0)
。
答案 4 :(得分:5)
您可以按如下方式声明函数指针:
bool (funptr*)();
其中说我们声明一个函数指针指向一个不带任何东西的函数并返回一个bool。
下一个作业:
funptr = A;
使用函数指针调用函数:
funptr();
答案 5 :(得分:4)
bool (*FuncPtr)()
FuncPtr = A;
FuncPtr();
如果要有条件地调用其中一个函数,则应考虑使用array of function pointers。在这种情况下,你有3个指向A,B和C的元素,你可以根据数组的索引调用一个元素,例如f的Aunc的afrayArray0。
答案 6 :(得分:2)
bool (*fptr)();
int main(void)
{
...
...
printf("Enter your choice");
scanf("%d",&a);
switch(a)
{
case 0:
fptr = A;
break;
case 1:
fptr = B;
break;
case 2:
fptr = C;
break;
case 3:
break;
}
(*fptr)();
return 0;
}
您的选择存储在;然后相应地,在函数指针中分配函数。最后,根据您的选择,调用相同的函数来返回所需的结果。
答案 7 :(得分:2)
请注意,当你说:
bool (*a)();
您声明a
类型“指向函数的指针返回bool
并获取未指定数量的参数”。假设已定义bool
(可能您使用的是C99并且已包含stdbool.h
,或者它可能是typedef),这可能是您想要的,也可能不是。
这里的问题是编译器现在无法检查a
是否分配给正确的值。您的函数声明存在同样的问题。 A()
,B()
和C()
都被声明为“返回bool
并获取未指定数量的参数的函数”。
要查看可能存在的问题,让我们编写一个程序:
#include <stdio.h>
int test_zero(void)
{
return 42;
}
static int test_one(char *data)
{
return printf("%s\n", data);
}
int main(void)
{
/* a is of type "pointer to function returning int
and taking unspecified number of parameters */
int (*a)();
/* b is of type "pointer to function returning int
and taking no parameters */
int (*b)(void);
/* This is OK */
a = test_zero;
printf("a: %d\n", a());
a = test_one; /* OK, since compiler doesn't check the parameters */
printf("a: %d\n", a()); /* oops, wrong number of args */
/* This is OK too */
b = test_zero;
printf("b: %d\n", b());
/* The compiler now does type checking, and sees that the
assignment is wrong, so it can warn us */
b = test_one;
printf("b: %d\n", b()); /* Wrong again */
return 0;
}
当我用gcc编译上面的内容时,它说:
行<{1}}的警告:从不兼容的指针类型
分配
,这很好。对b = test_one;
的相应分配没有警告。
因此,您应该将您的函数声明为:
a
然后保存函数的变量应声明为:
bool A(void);
bool B(void);
bool C(void);
答案 8 :(得分:2)
答案 9 :(得分:1)
为函数的给定签名声明一个函数指针变量,如下所示:
bool (* fnptr)();
你可以为它分配一个功能:
fnptr = A;
你可以称之为:
bool result = fnptr();
您可以考虑使用typedef为您需要的每个不同的函数签名定义类型。这将使代码更易于阅读和维护。即,对于没有参数返回bool的函数的签名,这可能是:
typdef bool (* BoolFn)();
然后你可以像这样用来声明这个类型的函数指针变量:
BoolFn fnptr;
答案 10 :(得分:1)
略有不同的方法:
bool A() {...}
bool B() {...}
bool C() {...}
int main(void)
{
/**
* Declare an array of pointers to functions returning bool
* and initialize with A, B, and C
*/
bool (*farr[])() = {A, B, C};
...
/**
* Call A, B, or C based on the value of i
* (assumes i is in range of array)
*/
if (farr[i]()) // or (*farr[i])()
{
...
}
...
}
答案 11 :(得分:1)
答案 12 :(得分:0)
//Declare the pointer and asign it to the function
bool (*pFunc)() = A;
//Call the function A
pFunc();
//Call function B
pFunc = B;
pFunc();
//Call function C
pFunc = C;
pFunc();
答案 13 :(得分:0)
我通常使用typedef来执行此操作,但如果您不必经常使用函数指针,则可能会有些过分。
//assuming bool is available (where I come from it is an enum)
typedef bool (*pmyfun_t)();
pmyfun_t pMyFun;
pMyFun=A; //pMyFun=&A is actually same
pMyFun();
答案 14 :(得分:0)
这已经得到了充分的回答,但您可能会觉得这很有用:The Function Pointer Tutorials。这是一个真正全面的主题处理,分为五章!
答案 15 :(得分:0)
通过函数指针调用函数
float add(int , float),result;
int main()
{
float (*fp)(int,float);
float result;
fp=add;
result=add(5,10.9); // Normal calling
printf("%f\n\n",result);
result=(*fp)(5,10.9); //calling via function Pointer
printf("%f\n\n",result);
result=(fp)(5,10.9); //calling via function Pointer,Indirection Operator can Be
omitted
printf("%f",result);
getch();
}
float add(int a,float b)
{
return a+b;
}
输出
15.90000
15.90000
15.90000