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)
对于您展示的示例,还可以做一件事.
可以说有一些功能需要为某些设备操作运行.以简单的方式,您可以在另一个主函数中编写所有函数调用并调用该主函数.
另一种方法是,将所有函数名称写在大括号中,并使用函数指针和循环调用每个函数名称.这看起来很聪明.我不确定这对你有什么帮助,但我在linux内核代码中看到了这一点.
我同意这里的所有答案.除此之外,我有一些自己的判断来使用函数指针.
让我们举一些复杂的数学计算的例子(比如打印Fibonacci,集成,傅立叶Xform等等).
你有一个函数FX(它可以执行复杂的数学运算或其他任何东西),你在程序中多次使用它.此功能用于许多不同的工作.
使用你的程序几个月之后,你会发现,对于某些工作,你可以改进功能,对于某些人来说,当前最好.你会做什么?编写一个新函数,去所有地方更改函数名称.
每次你找到更好的东西,你都会这样做.
相反,使用不同的函数指针进行不同的工作.在初始阶段,所有指针都可以指向一个函数.当您发现某项工作的更好功能时,只需转移指针即可完成.
采取另一种方案.在这里,你有一个真正的大代码,如手机操作系统.(不是完全开放但是一半编译).您需要为特定硬件添加蓝牙驱动程序.
现在,您可以添加或者您可以离开是OS中可用的选项.
您可能需要从许多地方打开/关闭蓝牙.
操作系统所做的是,它创建了一个函数指针,可以将蓝牙打开并在需要的地方使用它.此代码已编译,因此您无法在其中添加代码.但是可以做的是,你可以编写函数并使指针指向你的函数.
这是我在Android OS下已经看到的.(不完全但更接近)
根据我的经验,函数指针主要用于将一个函数作为参数传递给另一个函数。
看看你的代码,它们也可以像数组一样使用,所以你可以循环遍历整个数组(可能包含数百个函数指针),它只会执行它们。
现在的问题是我为什么要选择函数指针?
我会用函数指针获得什么好处?
您需要实现异步机制时使用函数指针.
当事情发生时,你需要异步调用一个函数.
你怎么知道要调用哪个函数?
每个函数的地址都是唯一的,所以你需要使用和存储函数地址.
你在哪里存储这个功能地址?
一个函数指针