如何使用函数指针调用函数?

时间:2009-12-23 11:15:45

标签: c function-pointers

假设我有这三个功能:

bool A();
bool B();
bool C();

如何使用函数指针有条件地调用其中一个函数,如何声明函数指针?

16 个答案:

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

阅读的最佳方式是 “顺时针/螺旋规则”'

大卫安德森

http://c-faq.com/decl/spiral.anderson.html

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

如果您需要有关复杂定义的帮助,例如:

double (*(*pf)())[3][4];

看看我的左右法则here

答案 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