10

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

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

4

7 回答 7

14

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

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

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

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


另一个与避免多次检查有关。IE。

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();
于 2012-06-04T06:41:41.110 回答
8

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

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



于 2012-06-04T06:33:34.760 回答
7

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

可以说有一堆功能需要运行以进行某些设备操作。简单来说,您可以在另一个主函数中编写所有函数调用并调用该主函数。

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


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

让我们以一些复杂的数学计算为例(如打印斐波那契、积分、傅里叶 Xform 等)。

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

使用您的程序几个月后,您会发现,对于某些工作,您可以改进功能,而对于某些工作,当前的最好。你会做什么?写一个新函数,去各处改函数名。

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

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


换一个场景。在这里,你有一个真正的大代码,比如手机操作系统。(未完全打开,但已编译一半)。您需要为特定硬件添加蓝牙驱动程序。

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

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

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

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

于 2012-06-04T09:14:27.733 回答
5

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

查看您的代码,它们也可以像数组一样使用,因此您只需循环整个数组(可能包含数百个函数指针),它就会全部执行。

于 2012-06-04T06:31:29.277 回答
4

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

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

函数指针有什么好处?

好吧,如上所述,在您设置函数指针时,您需要决定稍后将调用的位置,但是您可以忘记做出该决定的所有原因,只知道稍后的目的地已经准备好使用. 当你真正在做事的时候......“我周日的例行公事:睡到 10 点,吃一顿丰盛的早餐,回去睡觉,洗个澡,如果我有很多钱,那就去我的周日下午的大旅行,与朋友共进晚餐”......早些时候的决定只是让你去画廊。至关重要的是,您可以继续使用您熟悉的周日时间表并开始“指向”“下周日下午的大旅行”地址/指针,因为它们会引起您的注意,即使它们在您的总体时间表形成时并不存在。

您会看到这种事后灵活性,可以在 AusCBloke 提到的bsearch. qsort是另一个经典的例子——它知道有效排序任意事物数组的大图逻辑,但必须被告知去哪里比较你实际使用它的两个事物。

于 2012-06-09T06:51:59.897 回答
4

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

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

于 2012-06-04T06:30:50.630 回答
1

这些都是很好的例子,尤其是上面 Urvish 中的第一个。我也想知道同样的事情,我认为答案纯粹是设计。在我看来,它们是相同的结果,因为您可以指向一个函数并获取 a+b,或者您可以定期调用一个函数并获取 a+b,并且对于 SO 上的示例,它们通常很小且微不足道为了说明。 但是,如果一个人有一个 10k 行的 C 程序,而您因为做了一个更改而不得不更改 50 次,那么您可能很快就会明白为什么要使用函数指针。

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

于 2014-05-31T15:26:03.653 回答