我和小弦子都深以为然地点了点头,毕竟类似的问题老爹已经强调过好多遍了。
「好了,那我们就来讲讲最后一种情况,一个指针指向一个函数。先说如何定义一个函数指针:
返回值类型(*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除了指针名字不一样之外,其它都完全一样,这不是重复代码么?所以我们得像个办法把这个问题给解决了,不然以后我们要声明很多类似函数指针的时候还不得累死。
要是后面再修改,比如说修改返回值类型,或者修改参数列表类型……」