「行了行了,老爹你也不用做铺垫了,咱们开门见山直接说吧!大家都这么熟的人了,你这背后的套路早就我们看穿了。」
还不等老爹说完,我便挥手打断了他。
「……」
老爹是一阵语塞,满脸的无奈。
「这个时候,我们就可以使用typede这个喜欢取名字的家伙来定义函数指针类型。注意到,这里是定义的一种数据类型,这意味着我们可以使用这种类型来声明很多的变量,所以刚刚提到的问题也就迎刃而解了。具体的使用方法如下:
typede int(*Func)(int,int);
int max(int a,int b)
{
return a > b ? a : b;
}
int min(int a, int b)
{
return a < b ? a : b;
}
int main(int argc, char const* argv[])
{
Func max = max;
Func min = min;
int maxValue = max(3, 4);
int minValue = min(3, 4);
}
看到没,因为使用了typede,这个时候Func已经不是某个具体的指针变量了,而是摇身一变,升级成为了开山鼻祖。
这样一来,Func就成了一种函数指针类型,可以用来声明变量,所有返回值为int,有两个int参数的函数都可以赋值给它的变量。
到这里,指针和函数之间那些不可告人的关系就被我们全部摸透了。」
「可是老爹,你说了这么多,我也没有明白函数指针有什么用啊,如果我们要调用一个函数,直接用方法名调用不好么,何必这么麻烦?」
我不解道。
「嗯,之前我跟你们说了,其实函数指针最大的用处是作为参数传递给另外一个函数,这种就做回调机制,而作为参数传递的函数指针就被称之为回调函数。
现在我们就用一个贴近生活的小案例来说明回调函数。
假设我们住这个小区是非常高档的小区,甚至都和国际接轨了,里面除了中国人以外还居住了很多外国友人。
物业为了提高服务水品,于是要求保安叔叔们在小区门口和每一个进来小区的业主敬礼问好。
那现在问题就来了,敬礼还好,不管是中国人还是外国人都能够看懂。但是问好因为语言的差异性,会存在问题。如果说的话,大部分外国人听不懂,但是如果说英语的话,大部分中国人也听不懂。
于是啊,有个聪明的保安想出了一种让人拍案叫绝的办法,让进出的人自己选择问好的方式,这样一来,中国人问好用汉语,外国人问好用英语。
呐,上面的场景就可以用回调函数来实现:
typede void (*Func)(void);
void chineseSayHello(void)
{
print(“欢迎回家“);
}
void othersSayHello(void)
{
print(“welee go back home“);
}
void sayHello(Func sayHello)