VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 155|回复: 0

函数

[复制链接]
78_avatar_middle
最佳答案
0 
在线会员 发表于 2020-3-18 18:56:59 | 显示全部楼层 |阅读模式
1.在讲这个问题之前,我们要明白一个问题。就是我们为什么要把一个函数的地址作为参数传递给另一个参数。要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么还要用这么麻烦的办法去把函数当做参数来传递呢。下面我举个例子。
例如我们设计一个estimate() 的函数计算一个程序运行的时间,但不同的人估算时间的时候可能算法有所不同,算出的时间也应该不同。但我们都调用同一个estimate() 函数,现在该怎么办呢,重写estimate() 函数固然是一个办法,但是我们还有另外的办法,比如我们把estimate()函数中计算时间的算法作为一个公共变量让其作为参数传入,我们只需要把 各自的计算时间的算法写成一个函数,再通过参数传递给estimate() ,而estimate()中的内容还是原来的不变,这样就可以实现不同的人计算出来的时间不同了。

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

3.下面,来看一下函数地址是怎么传递的。
先说一次传递一个函数的: 我们先定义一个函数
double add(double x, double y)  
{  
    return x + y;  
}  
然后接着建立一个函数指针 double (*pf)(double,double)=add;  //这里(*pf)的括号不能省,不然就不是函数指针了。
我们现在有一个函数
double calculate(double x1, double y1, double(*f)(double, double))  //函数调用里面传递 函数指针数组 的方法  
{  
    cout << "add:" << (*f)(x1, y1) << endl;  
    return  1;  
}  

然后我们来进行值传递
int x = 2; y = 1;  

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

这是最基本的,下面讲我要说的重点,就是一次传递多个函数进去。
想传递多个函数进去,我们要建立一个函数数组 。先定义两个函数
double add(double x, double y)  
{  
    return x + y;  
}  
  
double add2(double x, double y)  
{  
    return x - y;  
}  
然后建立函数数组并赋值  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))

最后给出完整的代码
#include "iostream"  
using namespace std;   
double add(double, double);  
double add2(double x, double y);  
  
double calculate(double x1, double y1, double(**f)(double, double))  //函数调用里面传递 函数指针数组 的方法  
{  
    cout << "add:" << (*f[0])(x1, y1) << endl;  
    cout << "add2:" << (*f[1])(x1, y1) << endl;  
    return  1;  
}  
  
int main()  
{  
    int x, y;  
    double (*pf[2])(double,double) = { add, add2 };   
    x = 2; y = 1;  
    calculate(x, y, pf);  
  
    system("pause()");  
    return 0;  
}  
  

double add(double x, double y)  
{  
    return x + y;  
}  
  
double add2(double x, double y)  
{  
    return x - y;  
}  




上一篇:——以此献给所有OIer,以及所有竞赛生,以及所有为梦想而不顾一切的人。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-7-12 02:32

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表