功能指针与函数调用有什么区别?

Ras*_*yak 8 c function-pointers function

你好朋友,
我怎样才能使用函数指针数组?
如果我们将看到上面的链接,它会告诉我们函数指针是如何工作的.
现在的问题是我为什么要选择函数指针?
为什么我不能直接使用函数调用?
我会用函数指针获得什么好处?
例如

enum{a, b, c};
void A();
void B();
void C();
void (*fun[3])() = {A, B, C};

Now when I need to call a function I am doing like,
fun[a](); // This calls function A
// And so on...
Run Code Online (Sandbox Code Playgroud)

同样可以在函数调用中完成

就像我需要直接调用函数A,B或C.我可以这样

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

那为什么function pointer呢?

Aus*_*oke 11

使用函数指针有很多原因,特别是在C中一般做事情.

您将看到它们被使用的主要位置是作为函数的参数.例如,使用该函数bsearch,它使用比较函数作为函数指针传递,以比较项目并对数据进行排序:

void *bsearch(const void *key, const void *base,
                     size_t nmemb, size_t size,
                     int (*compar)(const void *, const void *));
Run Code Online (Sandbox Code Playgroud)

这允许bsearch通用并对任何类型的数据进行排序,因为只有该比较函数必须知道数据的类型.


另一个与避免多次检查有关.即.

void makePizza(void) { }

void bakeCake(void) { }

iWantPizza = 1;
...
if (iWantPizza)
   makePizza();
else
   bakeCake();
/* want to call the same function again... */
if (iWantPizza)
   makePizza();
else
   bakeCake();

..

/* alternative */
void (*makeFood)(void) = iWantPizza ? makePizza : bakeCake;

makeFood();
/* want to call the same function again... */
makeFood();
Run Code Online (Sandbox Code Playgroud)


Urv*_*ish 6

对于您展示的示例,还可以做一件事.

可以说有一些功能需要为某些设备操作运行.以简单的方式,您可以在另一个主函数中编写所有函数调用并调用该主函数.

另一种方法是,将所有函数名称写在大括号中,并使用函数指针和循环调用每个函数名称.这看起来很聪明.我不确定这对你有什么帮助,但我在linux内核代码中看到了这一点.


我同意这里的所有答案.除此之外,我有一些自己的判断来使用函数指针.

让我们举一些复杂的数学计算的例子(比如打印Fibonacci,集成,傅立叶Xform等等).

你有一个函数FX(它可以执行复杂的数学运算或其他任何东西),你在程序中多次使用它.此功能用于许多不同的工作.

使用你的程序几个月之后,你会发现,对于某些工作,你可以改进功能,对于某些人来说,当前最好.你会做什么?编写一个新函数,去所有地方更改函数名称.

每次你找到更好的东西,你都会这样做.

相反,使用不同的函数指针进行不同的工作.在初始阶段,所有指针都可以指向一个函数.当您发现某项工作的更好功能时,只需转移指针即可完成.


采取另一种方案.在这里,你有一个真正的大代码,如手机操作系统.(不是完全开放但是一半编译).您需要为特定硬件添加蓝牙驱动程序.

现在,您可以添加或者您可以离开是OS中可用的选项.

您可能需要从许多地方打开/关闭蓝牙.

操作系统所做的是,它创建了一个函数指针,可以将蓝牙打开并在需要的地方使用它.此代码已编译,因此您无法在其中添加代码.但是可以做的是,你可以编写函数并使指针指向你的函数.

这是我在Android OS下已经看到的.(不完全但更接近)


Ron*_*kal 5

根据我的经验,函数指针主要用于将一个函数作为参数传递给另一个函数。

看看你的代码,它们也可以像数组一样使用,所以你可以循环遍历整个数组(可能包含数百个函数指针),它只会执行它们。


Alo*_*ave 5

现在的问题是我为什么要选择函数指针?
我会用函数指针获得什么好处?

您需要实现异步机制时使用函数指针.
事情发生时,你需要异步调用一个函数.
你怎么知道要调用哪个函数?
每个函数的地址都是唯一的,所以你需要使用和存储函数地址.
你在哪里存储这个功能地址?
一个函数指针