函数的参数传递


在一般情况下,什么时候用传值的方式,什么时候用传址的方式进行参数传递。这样做的考虑是什么?       在进行参数传递时应注意什么问题?
函数参数传递机制的基本理论
  函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。
   值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实 参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
  引 用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来 的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何 操作都影响了主调函数中的
实参变量。


作为函数的传递:

#include "stdafx.h"
#include "iostream"
using namespace std;


float MF1 (float x,float b1,float b2,float b3,float b4,float c)//测试的隶属函数
{
  if(x <=c)
        {
            return b1*(x-b2);
        }
    else
        {
            return b3*(b4-x);
        }
}

float integral(float(*fun)(float x,float b1,float b2,float b3,float b4,float c),float a,float b,int n)
{
    float s;
    float h;
    float y;
    int i;
    s=(fun(a,2,3,4,5,6)+fun(b,1,3,4,5,6))/2; /*区间段上函数值评均*/
    h=(b-a)/n; /*积分步长*/
    for(i=1;i <n;i++)
        {
            s=s+fun(a+i*h,2,3,4,5,6); /*分段叠加*/
            y=s*h;
        }
    return y;/*返回积分值*/
}



int sum(int a , int b)
{
 return a+b;
}

int TotalSum(int(*fun)(int a, int b),int c, int d)
{
   return fun(2,3)+c+d;
}


void main()
{
    //float y=    integral(MF1,100,20,1000);

        int y=TotalSum(sum,4,5);

     cout<<y;
     cin>>y;
}
对于参数传递,有3种方式:a 传值 b 传引用 c 传指针

  如果是基本数据类型,那就传值,如果是传递大的对象,那当然是传引用。而对于引用来说,是赋了值后就不会改变的,应该加const, (const &a). 如果函数体要改变这个对象,那就传指针。这是一个结论,以下说明原因。

  将实参传递给形参,需要赋值操作,对于基本数据类型,当然是很快的,但是对于大的对象来说,赋值就是个性能的瓶颈了,因此,我们使用一个引用来传递,不需要赋值,只是引用到一个已经存在的对象上即可,这样明显效率高很多。

    另外,一个很重要的情况。传值和传常量引用实参是不会被形参改变的。而如果函数体要改变实参的值,必须是传指针。

   总结:1 按值调用使用于不被函数更改的小对象;2 按常量引用调用适用于不被函数改变的大对象;3 按指针调用适用于所有可以被函数更改的对象(包含大对象和小对象)。


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值