返回第五十一章 指针(六)(2 / 2)程序媛养成计划首页

我和小弦子都深以为然地点了点头,毕竟类似的问题老爹已经强调过好多遍了。

「好了,那我们就来讲讲最后一种情况,一个指针指向一个函数。先说如何定义一个函数指针:

返回值类型(*pname)(参数类型1,参数类型2……)

例如:

int (*p)(int,int)

就声明了一个函数指针变量,它可以指向返回值为int类型,参数列表为两个int类型的所有函数。

int max(int a, int b)

{

return a > b ? a : b;

}

int min(int a, int b)

{

return a > b ? b : a;

}

比如说这里的max和min都符合条件,所以我们就可以这样:

int (*pmax)(int,int);

int (*pmin)(int,int);

pmax = max;

pmin = min;

如果要使用函数指针来执行指向的函数,就需要这样:

int maxValue =(*pmax)(3,4);

int minValue =(*pmin)(1,2);」

「看上去就好复杂的样子……」

我皱着眉头看着老爹幻灯片上敲出来的这些内容,突然觉得脑袋运转都几乎停滞了。

「既然如此,那我们就来解析一下。我们在声明一个变量时,会使用int、

double等类型描述符,其本质在于告诉计算机这个变量的内存占用情况,以及读写时的规则。是这样的吧?」

我和小弦子点了点了点头。

「那么我们声明这些变量的指针的时候,是不是也要声明使用指针读写数据时的规则呢?」

「嗯嗯」

「同样的,我们在定义一个函数的时候,是不是要告诉计算机这个函数的返回值、参数列表?那么同样的,我们声明一个函数指针也要具备这些啊。

在声明一个指针变量的时候我们是不是会用到*』?」

「是的」

「同理,函数指针它也是一个指针,那它凭哪样搞特殊不使用*』来自报家门,告诉计算机自己是一个指针变量呢?

再问,当我们要访问一个指针的指向的地址中的内容是,会使用什么?」

「*」

「那不就结了么?那函数指针虽然指向的是一个函数,那么我们要访问这个函数,不得也用*』么?

按照这个思路,你们再去看看上面的代码,是不是就能够明白其中的含义了呢?」

「卧槽,有道理啊!」

还别说,经过老爹这么解释,似乎还真的有那么一些道理。

「其实啊,这种格式看上去的确是麻烦,而且pmax和pmin除了指针名字不一样之外,其它都完全一样,这不是重复代码么?所以我们得像个办法把这个问题给解决了,不然以后我们要声明很多类似函数指针的时候还不得累死。

要是后面再修改,比如说修改返回值类型,或者修改参数列表类型……」