副标题#e#
函数存放在内存的代码区域内,它们同样有地点,我们如何能得到函数的地点呢?
假如我们有一个int test(int a)的函数,那么,它的地点就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地点。
界说一个指向函数的指针用如下的形式,以上面的test()为例:
int (*fp)(int a);//这里就界说了一个指向函数的指针
函数指针不能绝对不能指向差异范例,可能是带差异形参的函数,在界说函数指针的时候我们很容易犯如下的错误。
int *fp(int a);//这里是错误的,因为凭据团结性和优先级来看就是先和()团结,然后酿成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要留意!
下面我们来看一个详细的例子:
#include <iostream>
#include <string>
using namespace std;
int test(int a);
void main(int argc,char* argv[])
{
cout<<test<<endl;//显示函数地点
int (*fp)(int a);
fp=test;//将函数test的地点赋给函数学指针fp
cout<<fp(5)<<"|"<<(*fp)(10)<<endl;
//上面的输出fp(5),这是尺度c++的写法,(*fp)(10)这是兼容c语言的尺度写法,两种同意,但留意区分,制止写的措施发生移植性问题!
cin.get();
}
int test(int a)
{
return a;
}
typedef界说可以简化函数指针的界说,在界说一个的时候感受不出来,但界说多了就知道利便了,上面的代码改写成如下的形式:
#include <iostream>
#include <string>
using namespace std;
int test(int a);
void main(int argc,char* argv[])
{
cout<<test<<endl;
typedef int (*fp)(int a);//留意,这里不是生命函数指针,而是界说一个函数指针的范例,这个范例是本身界说的,范例名为fp
fp fpi;//这里操作本身界说的范例名fp界说了一个fpi的函数指针!
fpi=test;
cout<<fpi(5)<<"|"<<(*fpi)(10)<<endl;
cin.get();
}
int test(int a)
{
return a;
}
函数指针同样是可以作为参数通报给函数的,下面我们看个例子,仔细阅读你将会发明它的用处,稍加推理可以很利便我们举办一些巨大的编程事情。
#p#副标题#e#
//——————-该例以上一个例子作为基本稍加了修改—————————–
//-------------------该例以上一个例子作为基本稍加了修改-----------------------------
#include <iostream>
#include <string>
using namespace std;
int test(int);
int test2(int (*ra)(int),int);
void main(int argc,char* argv[])
{
cout<<test<<endl;
typedef int (*fp)(int);
fp fpi;
fpi=test;//fpi赋予test 函数的内存地点
cout<<test2(fpi,1)<<endl;//这里挪用test2函数的时候,这里把fpi所存储的函数地点(test的函数地点)通报了给test2的第一个形参
cin.get();
}
int test(int a)
{
return a-1;
}
int test2(int (*ra)(int),int b)//这里界说了一个名字为ra的函数指针
{
int c=ra(10)+b;//在挪用之后,ra已经指向fpi所指向的函数地点即test函数
return c;
}
操作函数指针,我们可以组成指针数组,更明晰点的说法是组成指向函数的指针数组,这么说大概就容易领略的多了。
#include <iostream>
#include <string>
using namespace std;
void t1(){cout<<"test1";}
void t2(){cout<<"test2";}
void t3(){cout<<"test3";}
void main(int argc,char* argv[])
{
void* a[]={t1,t2,t3};
cout<<"较量t1()的内存地点和数组a[0]所存储的地点是否一致"<<t1<<"|"<<a[0]<<endl;
cout<<a[0]();//错误!指针数组是不能操作数组下标操纵挪用函数的
typedef void (*fp)();//自界说一个函数指针范例
fp b[]={t1,t2,t3}; //操作自界说范例fp把b[]界说趁一个指向函数的指针数组
b[0]();//此刻操作指向函数的指针数组举办下标操纵就可以举办函数的间接挪用了;
cin.get();
}
仔细看上面的例子大概不消我多说各人也会知道是怎么一会工作了,最后我们做一个重点小结,只要记着这一点,对付领略操作函数指针组成数组举办函数间接挪用就很容易了!
void * a[]={t1,t2,t3};
cout<<"较量t1()的内存地点和数组a[0]所存储的地点是否一致"<<t1<<"|"<<a[0]<<endl;
cout<<a[0]();//错误!指针数组是不能操作数组下标操纵挪用函数的
上面的这一小段中的错误行,为什么不能这么挪用呢?
#p#分页标题#e#
前一篇教程我们已经说的很清楚了,不外在这里我们照旧温习一下观念,指针数组元素所生存的只是一个内存地点,既然只是个内存地点就不行能举办a[0]()这样地点带括号的操纵,而函数指针差异它是一个破例,函数指针只所以这么叫它就是因为它是指向函数指向内存的代码区的指针,它被系统授予答允与()括号操纵的权利,举办间接的函数挪用,既然函数指针答允这么操纵,那么被界说成函数指针的数组就必然是可以一样的操纵的。