推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

函数不能做参数,但是指向函数的指针可以啊!

   2023-07-07 网络整理佚名1810
核心提示:返回值是指向T类型的指针,有一个T类型参数的函数;指向一个返回值是T类型,有一个T类型参数的函数的指针。应用到2上面的时候,括号里面是*f,我们可以看出f是一个指针,指针要想有用,那么它就得指向点什么东西(空指针当然也有用),从剩余的声明部分,我们看到,f指向一个函数,这个函数有一个T类型的参数,返回值是T类型。通过指向函数的指针,我们就可以像一样把函数“抛来抛去”了。

C/C++中的指针可谓是混合型。 喜欢它的人认为指针很强大,可以让我们更接近机器底层,提高效率; 不喜欢的人认为指针使用不当造成了无数的漏洞,而且指针难以理解和控制。 喜欢和不喜欢指针都有充分的理由。 即使经验丰富的程序员也常常对其奇怪的行为感到困惑,但他们不得不承认指针是一个强大的工具。 想要真正学好C/C++语言,指针是必须要攻克的。 理解指针的方式也很简单,“没有别人,只有手熟悉”。

本文从公式的 C 语言实现中展示了函数指针的神奇力量。

01

公式

计算定积分对于很多人来说并不陌生。 数学家发展了许多积分技术,如分部积分、交换元素积分等。 但用笔计算分数毕竟不是一件容易的事。 毕竟,还有很多函数的原函数不能用初等函数来表示(原函数为初等函数的函数只占所有函数的一小部分,换句话说,大多数函数无法“积分”),而不是值得一提的是,在实际应用中,在某些点上只能得到积分函数的值的情况并不少见,而很难得到其解析公式。 那么该怎么办? 聪明的人类想到了用数值方法来近似定积分的值。 公式是较简单的方法之一。 它的基本思想是用抛物线的面积来近似一个区域的面积。

上面的图表和公式取自 (Early), James, 7th。 这个公式可能和其他一些书上给出的不太一样,但这本书里公式的推导是我见过最清晰的。 下面的C语言部分就是按照这个公式来组织代码。

02

指向函数的指针

在这一部分,我们用C语言来实现这个公式。 在看代码之前,我们先看一个连接问题。

T*f(Tx);

T (*f)(T x);

返回值是一个指向T类型的指针,一个参数为T类型的函数;

指向返回类型 T 且具有一个 T 类型参数的函数的指针。

问:请将1和2与A和B中的正确解释连接起来。

(这里我避免使用“函数指针”和“指针函数”之类的术语,原因很简单,直到现在,我仍然分不清什么是“函数指针”,什么是“指针函数”。)

回到上面的连接问题,1和2给出的声明几乎一模一样,只是2比1多了一个括号。不过,正是这个括号的不同,使得一个是函数,另一个是指针。 C/C++ 中的复杂声明令人头疼。 K&R圣经提醒我们(如果本书没有这么说,那就是在C++中),当你看到复杂的声明时,可以使用“从内到外”的方法,当遇到括号时,括号内的优先级是更高。 将这个方法应用到1上。首先,f后面有括号,表明这是一个函数。 f左边的*告诉我们它的返回值是一个指针。 指针指向的类型自然用T表示。所以1对应的解释是A。应用于2时,括号里有*f。 我们可以看到f是一个指针。 如果指针有用,它必须指向某个东西(当然,空指针也有用)。 从声明的其余部分,我们看到,f指向一个函数,这个函数有一个T类型的参数,返回值也是T类型。

现在我们来看看实现部分。 这段代码的功能部分还有改进的空间,但为了让代码更容易理解,更好的体现小抛物线下的面积相加过程,我不做进一步的简化。 这里的实现表面上和第一部分的公式不同,但实际上是一样的。

关于参数的描述,这里的n是小抛物线的数量,与公式第一部分中的n不同,很容易看出两者之间的关系。 a、b分别为积分下限和上限。

接下来,使用此函数来近似 pi。

我们知道:

这个被积数可以用初等函数来表示,而这个定积分的值恰好是pi。 我们用5条小抛物线,11个点来计算这个值:

看来结果还不错。 有了指向函数的指针,我们就可以像函数一样“扔掉它”。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON