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

31 c function-pointers

假设我有这三个功能:

bool A();
bool B();
bool C();
Run Code Online (Sandbox Code Playgroud)

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

Abh*_*eet 35

您可以执行以下操作:假设您具有以下A,B和C功能:

bool A()
{
   .....
}

bool B()
{
   .....
}

bool C()
{

 .....
}
Run Code Online (Sandbox Code Playgroud)

现在在其他一些函数,比如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");

.........
  .........
  }
Run Code Online (Sandbox Code Playgroud)

记住这是函数指针的一个例子.还有其他几种方法,你必须清楚地学习功能指针.

  • 此链接中有一些示例.你可以参考这个链接cprogramming.com/tutorial/function-pointers.html/...你也可以访问其他链接,如publications.gbdirect.co.uk/c_book/chapter5/...等. (3认同)

Pab*_*ruz 20

像这样声明你的函数指针:

bool (*f)();
f = A;
f();
Run Code Online (Sandbox Code Playgroud)


Dal*_*und 17

我认为你的问题已经得到了足够的回答,但是明确地指出给定一个函数指针可能是有用的

void (*pf)(int foo, int bar);
Run Code Online (Sandbox Code Playgroud)

这两个电话

pf(1, 0);
(*pf)(1, 0);
Run Code Online (Sandbox Code Playgroud)

根据定义,各方面都完全相同.选择哪个使用取决于您,尽管保持一致是个好主意.很长一段时间,我更喜欢,(*pf)(1, 0)因为在我看来它更好地反映了它的类型pf,但是在过去的几年里我已经转向了pf(1, 0).

  • @lkanab [§6.5.2.2.1](http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf#subsection.6.5.2) 及其脚注 94,以及[§6.3.2.1.4](http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf#subsection.6.3.2) 中函数指示符的定义表明 (令人惊讶的是,对我来说)`pf(1, 0);`被“转换”为`(*pf)(1, 0);`(如果我的编号错误,抱歉) (3认同)

Vij*_*jay 14

最初定义一个函数指针数组,它接受一个void并返回一个void.假设你的函数正在取消空白并返回空白.

typedef void (*func_ptr)(void);
Run Code Online (Sandbox Code Playgroud)

现在你可以用它来创建这些函数的函数指针变量.如下:

func_ptr array_of_fun_ptr[3];
Run Code Online (Sandbox Code Playgroud)

现在将函数的地址存储在三个变量中.

array_of_fun_ptr[0]= &A;
array_of_fun_ptr[1]= &B;
array_of_fun_ptr[2]= &C;
Run Code Online (Sandbox Code Playgroud)

现在你可以使用函数指针调用这些函数,如下所示:

some_a=(*(array_of_fun_ptr[0]))();
some_b=(*(array_of_fun_ptr[1]))();
some_c=(*(array_of_fun_ptr[2]))();
Run Code Online (Sandbox Code Playgroud)

  • 一些小的修正:1.在函数之前不需要`&`.`array_of_fun_ptr [0] = A`足够好了.2.函数调用中的`void`是一个错误.3.在函数调用之前不需要`*`.`array_of_fun_ptr [0]()`更干净.虽然没有伤害:) (3认同)

cod*_*ict 6

您可以按如下方式声明函数指针:

bool (funptr*)();
Run Code Online (Sandbox Code Playgroud)

这说我们正在声明一个函数指针,该函数指向一个不带任何东西的函数并返回一个bool.

下一个作业:

funptr = A;
Run Code Online (Sandbox Code Playgroud)

要使用函数指针调用该函数:

funptr();
Run Code Online (Sandbox Code Playgroud)


Fir*_*aad 5

bool (*FuncPtr)()

FuncPtr = A;
FuncPtr();
Run Code Online (Sandbox Code Playgroud)

如果您想有条件地调用其中一个函数,则应考虑使用函数指针数组。在这种情况下,您将有 3 个元素指向 A、B 和 C,并且您根据数组的索引调用其中一个元素,例如 A 的 funcArray0。