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

时间:2012-06-04 06:28:23

标签: c function function-pointers

你好朋友,
How can I use an array of function pointers?
如果我们看到上面的链接,它会告诉我们函数指针是如何工作的 现在问题是为什么我应该选择函数指针?
为什么我不能直接使用函数调用?
我将使用函数指针获得哪些好处?
e.g

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...

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

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

一样
A();
B();
or 
C();

那么为什么function pointer

7 个答案:

答案 0 :(得分:11)

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

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

void *bsearch(const void *key, const void *base,
                     size_t nmemb, size_t size,
                     int (*compar)(const void *, const void *));

这允许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();

答案 1 :(得分:6)

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

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

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


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

让我们举一些复杂的数学计算的例子(比如印刷Fibonacci,积分,傅立叶Xform等等)。

你有一个在你的程序中多次使用的函数FX(它可以进行复杂的数学计算或其他任何事情)。此功能用于许多不同的工作。

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

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

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


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

现在,你可以添加或者你可以离开是操作系统中可用的选项。

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

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

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

答案 2 :(得分:5)

  

现在的问题是我为什么要选择功能指针?   我将通过函数指针获得哪些好处?

当您需要实现异步机制时,可以使用函数指针 当某事发生时,您需要异步调用一个函数 您如何知道要拨打哪个功能?
每个函数的地址都是唯一的,所以你需要使用和存储函数地址 您在哪里存储此功能地址?
功能指针

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

  

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

这就像要求编译器“告诉我国家美术馆的地址(我可能想稍后去那里,我想做好准备)”之间的区别,而不是“带我去国家美术馆”现在(但我不会注意你如何让我到那里,所以不要指望我以后知道)“。至关重要的是,如果你要求地址/指针,你可以在某个地方写下来,比如“下周日下午的大旅行”......你甚至不必记住它是你要去的国家美术馆 - 当你到达那里时,这可能是一个惊喜 - 但你立即知道你周日的娱乐活动已全部排序。

  

使用函数指针可以获得什么好处?

嗯,如上所述,在您设置功能指针时,您需要决定稍后调用的位置,但是您可以忘记做出该决定的所有原因,并且只知道后来的目的地全部准备启用。当你实际做的事情......“我的星期天例行公事:睡到10点,吃一顿丰盛的早餐,回去睡觉,洗澡,如果我有足够的钱,那就去我星期天下午的大旅行,和朋友一起吃晚饭“......早先的决定只是为了让你去画廊。至关重要的是,你可以继续使用你熟悉的星期日时间表并开始“指点”下一个星期天下午的大旅行地址/指针,因为它们引起你​​的注意,即使它们在你的总体时间表形成时不存在。 / p>

你可以看到这种事后灵活性,可以通过AusCBloke提到的bsearch来改变分配给旧程序中一步的目的地。 qsort是另一个经典的例子 - 它知道有效排序任意事物数组的大图逻辑,但必须告诉你去哪里比较你实际使用它的两个东西。

答案 5 :(得分:2)

函数指针是指针(如变量指针),它指向函数的地址。当你像函数调用那样取消引用它们时,它们实际上调用了底层函数。

函数指针的主要优点是可以将它作为参数传递给另一个函数,例如......

答案 6 :(得分:1)

这些都是很好的例子,尤其是上面的Urvish中的第一个例子。我想知道同样的事情,我认为答案纯粹是设计。在我看来,它们是相同的结果,因为你可以指向一个函数并得到一个+ b,或者你可以定期调用一个函数并得到一个+ b,并且通过SO上的例子,它们通常是小而琐碎的为了说明。 但是,如果有一个10k C线程序,并且由于你做了一个改变你不得不改变了五十次,你可能很快就会发现为什么你想要使用函数指针。

它还使您欣赏OOP语言的设计和OOD背后的哲学。