使用函数地址调用该函数

1.在讲这个问题之前,我们要明白一个问题。就是我们为什么要把一个函数的地址作为参数传递给另一个参数。要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么还要用这么麻烦的办法去把函数当做参数来传递呢。下面我举个例子。

例如我们设计一个estimate() 的函数计算一个程序运行的时间,但不同的人估算时间的时候可能算法有所不同,算出的时间也应该不同。但我们都调用同一个estimate() 函数,现在该怎么办呢,重写estimate() 函数固然是一个办法,但是我们还有另外的办法,比如我们把estimate()函数中计算时间的算法作为一个公共变量让其作为参数传入,我们只需要把 各自的计算时间的算法写成一个函数,再通过参数传递给estimate() ,而estimate()中的内容还是原来的不变,这样就可以实现不同的人计算出来的时间不同了。


2.既然知道了函数参数传递的用处,那么我们现在就来说一下它的用法。

首先参数传递分为两种,一种是值传递,一种是地址传递。  一般我们传递时用的是地址传递。因为,若是采用值传递的话,比如我们传递一个数组 double a[100],则在调用函数的时候。编译器会把这整个数组复制到函数中,这样使用的空间是 100*sizeof(double)=800.若是我们只传递数组名 a 这个地址的话,那么复制进去的空间只有 64/8=8 这么多(假设计算机是64位的)。这样比较下来,就有了100倍的差距,是不是很吓人。 所以,不管是函数作为参数,还是数组,结构体什么的,我们一般都用地址传递,而不用值传递,记好了。


3.下面,来看一下函数地址是怎么传递的。

先说一次传递一个函数的: 我们先定义一个函数 

  1. double add(double x, double y)  
  2. {  
  3.     return x + y;  
  4. }  

 
 
  1. double add(double x, double y)
  2. {
  3. return x + y;
  4. }
然后接着建立一个函数指针 double (*pf)(double,double)=add;  //这里(*pf)的括号不能省,不然就不是函数指针了。

我们现在有一个函数

  1. double calculate(double x1, double y1, double(*f)(doubledouble))  //函数调用里面传递 函数指针数组 的方法  
  2. {  
  3.     cout << "add:" << (*f)(x1, y1) << endl;  
  4.     return  1;  
  5. }  

 
 
  1. double calculate(double x1, double y1, double(*f)(double, double)) //函数调用里面传递 函数指针数组 的方法
  2. {
  3. cout << "add:" << (*f)(x1, y1) << endl;
  4. return 1;
  5. }

然后我们来进行值传递

  1. int x = 2; y = 1;  
int x = 2; y = 1;

 
 
  1. calculate(x, y, pf);  
calculate(x, y, pf);
 
 
最后可以得到输出的结果是 2+1=3。


这是最基本的,下面讲我要说的重点,就是一次传递多个函数进去。

想传递多个函数进去,我们要建立一个函数数组 。先定义两个函数

  1. double add(double x, double y)  
  2. {  
  3.     return x + y;  
  4. }  
  5.   
  6. double add2(double x, double y)  
  7. {  
  8.     return x - y;  
  9. }  

 
 
  1. double add(double x, double y)
  2. {
  3. return x + y;
  4. }
  5. double add2(double x, double y)
  6. {
  7. return x - y;
  8. }
然后建立函数数组并赋值  double (*pf[2])(double,double) = { add, add2 }; 

接着传递给上面定义的calculate函数。调用方式为:calculate(x, y, pf);

calculate函数的接收方式应为:double calculate(double x1, double y1, double(**f)(double, double)) //传递的pf是一个数组的数组名且本身也是一个指针,即为二重指针     或者double calculate(double x1, double y1, double(*f[])(double, double))


最后给出完整的代码

  1. #include "iostream"  
  2.   
  3. using namespace std;  
  4.   
  5. double add(doubledouble);  
  6. double add2(double x, double y);  
  7.   
  8. double calculate(double x1, double y1, double(**f)(doubledouble))  //函数调用里面传递 函数指针数组 的方法  
  9. {  
  10.     cout << "add:" << (*f[0])(x1, y1) << endl;  
  11.     cout << "add2:" << (*f[1])(x1, y1) << endl;  
  12.     return  1;  
  13. }  
  14.   
  15. int main()  
  16. {  
  17.     int x, y;  
  18.     double (*pf[2])(double,double) = { add, add2 };   
  19.     x = 2; y = 1;  
  20.     calculate(x, y, pf);  
  21.   
  22.     system("pause()");  
  23.     return 0;  
  24. }  
  25.   
  26.   
  27.   
  28. double add(double x, double y)  
  29. {  
  30.     return x + y;  
  31. }  
  32.   
  33. double add2(double x, double y)  
  34. {  
  35.     return x - y;  
  36. }  

 
 
  1. #include "iostream"
  2. using namespace std;
  3. double add(double, double);
  4. double add2(double x, double y);
  5. double calculate(double x1, double y1, double(**f)(double, double)) //函数调用里面传递 函数指针数组 的方法
  6. {
  7. cout << "add:" << (*f[ 0])(x1, y1) << endl;
  8. cout << "add2:" << (*f[ 1])(x1, y1) << endl;
  9. return 1;
  10. }
  11. int main()
  12. {
  13. int x, y;
  14. double (*pf[ 2])( double, double) = { add, add2 };
  15. x = 2; y = 1;
  16. calculate(x, y, pf);
  17. system( "pause()");
  18. return 0;
  19. }
  20. double add(double x, double y)
  21. {
  22. return x + y;
  23. }
  24. double add2(double x, double y)
  25. {
  26. return x - y;
  27. }

转载自:http://blog.csdn.net/c_flybird/article/details/49431009

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值