加载中…
个人资料
liht1634
liht1634
  • 博客等级:
  • 博客积分:0
  • 博客访问:223,266
  • 关注人气:58
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

C语言-函数名作为函数的输入参数

(2018-07-07 14:59:52)
标签:

函数名作为函数的输入

分类: 编程类

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

1)函数地址如何传递
先说一次传递一个函数的: 我们先定义一个函数 
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;
}

在函数void function()中,需要将另外一个函数double input()的函数名作为输入参数。
定义函数指针:
typedef double (*P)(int);
Note:红色字体部分需要注意,函数input()所有的输入参数类型都需要包含在内。

例如 double input(double u[5], int num, double x),则在定义时写作 typedef double (*P)(double*,int,double)。


此时函数作为一种类型,可以直接被其它函数调用。

调用格式:
函数声明中定义 void function(P input),调用function(input)即可。


例子:
#include "stdio.h"
#include "string.h"

typedef int (*P)(int);
void function(P input);
int input(int a);

int main()
{
    function(input);
    return 0;
}

void function(P input)
{
    printf("ok");
}
int input(int a)
{
    return a+5;
}

typedef int (*p) (int *p);的说明:
定义一个函数指针类型(注意是类型)p,指向一个函数,该函数接受一个参数int *型,返回int。
也就是说,有这样的定义:
typedef int (*p) (int *p);
int foot(int *); //声明,foot在其它地方定义
可以这样使用:
p pf = foot; //&foot也可以,一个意思

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有