函数指针同样是可以作为参数传递给函数的,下面我们看个例子,仔细阅读你将会发现它的用处,稍加推理可以很方便我们进行一些复杂的编程工作。 //-------------------该例以上一个例子作为基础稍加了修改----------------------------- #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]();//错误!指针数组是不能利用数组下标操作调用函数的 上面的这一小段中的错误行,为什么不能这么调用呢?
前一篇教程我们已经说的很清楚了,不过在这里我们还是复习一下概念,指针数组元素所保存的只是一个内存地址,既然只是个内存地址就不可能进行a[0]()这样地址带括号的操作,而函数指针不同它是一个例外,函数指针只所以这么叫它就是因为它是指向函数指向内存的代码区的指针,它被系统授予允许与()括号操作的权利,进行间接的函数调用,既然函数指针允许这么操作,那么被定义成函数指针的数组就一定是可以一样的操作的。 |