一天不更新博客,生理难受。
介绍一下今天的主角:函数指针。顾名思义,函数指针就是一个指针,而且是存放函数地址的指针,通过函数指针,可以找到该地址处存放的函数,使得多元化的使用函数。
通过之前的知识,我们知道数组名可以代表数组首元素的地址,同样的,函数名也可以代表该函数的地址。即:函数名==&函数名。
函数指针的格式为:
函数的返回类型(*变量名)(参数类型)=函数名;
注意,参数类型只需声明参数的类型即可,如果有多个参数,那么使用逗号将每个参数类型分隔开。
举个例子:
有一个函数void ADD(int x,int y);
定义一个指针变量pADD存放函数ADD,可以将函数指针写为:
①void (*pADD)(int,int)=&ADD;
②void (*pADD)(int,int)=ADD;
那么得知了函数指针的书写格式,我们来了解一下函数指针的调用,我们按照上面创建的函数指针为前提,它对应的调用方式有:
①(*变量名)(参数);
例:int ret=(*pADD)(3,4);
②变量名(参数);
例:int ret=pADD(3,4);
值得注意的是,不能写为 *变量名(参数); 因为,这样写会导致优先级的问题,变量名会首先和函数调用操作符联用。
那么下面讲两个特殊的例子分析一下,加深理解:
①(*(void(*)())0)()
void(*)():函数指针类型。
(void(*)())0:将0强制转换为一个函数的地址。
*(void(*)())0:对0进行解引用操作。
(*(void(*)())0)():调用地址0处的函数。
总结:将0处的地址存储为函数,调用0地址处的函数,该函数的返回值类型为void。
②void (*signal(int,void(*)()int))(int);
signal和()结合,signal是函数名。
signal函数的第一个参数类型为int,第二个参数的类型是函数指针,该函数指针指向一个参数为int,返回类型为void的函数。
指针是c的法宝,肯定不会简单,如果半路放弃,那么永远只会徘徊在指针的门外,所以,加油!!!!
对于咋们不会整活的人来说,铁子们的一个赞或一个评论都颇为重要。如果这片文章有帮助到你,还请点个赞,评论一下,谢谢啦。