浅谈函数的参数传递

       第一次在CSND上写博文,和朋友们一起分享我的学习心得和体会。如果有哪里讲的不对或是有欠缺的地方,望朋友们不吝赐教!!

      交流:csdn  或是 QQ 1414393882  

 

      好吧,今天我们就一起来讨论一下函数的参数传递,下面就通过几个简单的程序来谈谈~~ 开始咯!!

      大家应该对“交换两个数”并不陌生吧,这也是很多教材作为讲解的经典例子,在此请允许我效仿一番,但我会加入自己的理解与不同的看法。。。

     版本一

     #include<iostream>
     using namespace std;

     int main(void)
    {
           int a = 10;
           int b = 20;
           int t;

           t = a;
           a = b;
           b = t;

          cout<<"a = "<<a<<", b = "<<b<<endl;

    }

 这个是最原始的版本了,可以达到交换 a 与 b 的值。此时 a = 20, b = 10

 那么如果把交换两数的功能写成一个函数呢?

      版本二

     //这种方法称为值传递,就是在栈中会创建两个数的拷贝

     #include<iostream>
     using namespace std;
     void swap(int a, int b)
    {
             int t;
 
            t = a;
            a = b;
            b = t;
    }
    int main(void)
    {
           int a = 10;
           int b = 20;
 
          swap(a, b);
          cout<<"a = "<<a<<", b = "<<b<<endl;

}

此时 a = 10, b = 20  首先main函数中的a ,b 与swap的形参a , b是互不影响的, 因为 main函数中的a ,b只作用于main函数中,有自己的一份内存空间;swap的形参a , b也有自己的一份内存空间,作用于swap函数,swap函数一结束,swap的形参a , b 就不存在了。所以输出的a , b依旧是main函数中的原来的a,b的值。

 

      版本三

     #include<iostream>
     using namespace std;
     void swap(int *p, int *q)
    {
              int *t;
 
              t = p;
              p = q;
              q = t;
    }
    int main(void)
   {
             int a = 10;
             int b = 20;
 
            swap(&a, &b);   
            cout<<"a = "<<a<<", b = "<<b<<endl;

    }

为了说明方便,我把形参中的a, b换成p, q;对程序结果完全不影响!!

此时的结果依然是 a = 10, b = 20  那为什么呢?

首先我们看到swap(&a, &b);  是取a , b各自的地址作为实参传递过去,形参p , q 也分配了内存空间,请看下面的表:

变量                内存地址 (假设)       变量的值

  a                      1001h                          10      

  b                       2001h                          20

  p                       3001h                         1001h   (是a的内存地址)

  q                       4001h                          2001h  (是b的内存地址)

 

经过swap函数之后:

变量                内存地址 (假设)       变量的值

  a                      1001h                          10      

  b                       2001h                          20

  p                       3001h                         2001h   (是b的内存地址)

  q                       4001h                         1001h  (是a的内存地址)

 

我们看到交换的只是p , q的值(p,q是指针变量,保存的是地址),所以根本对a, b没有任何影响~~~

 

    版本四

    //这种方法是通过指针来传递参数,编译器不会在栈中创建两个数的拷贝,是对a, b 原始值的操作

     #include<iostream>
     using namespace std;
     void swap(int *p, int *q)
    {
                 int t;
 
                  t = *p;

                 *p = *q;
                 *q = t;
    }
    int main(void)
   {
                int a = 10;
                int b = 20;
 
                swap(&a, &b);
                cout<<"a = "<<a<<", b = "<<b<<endl;

  }

 此时的a = 20, b = 10 终于把两个数交换过来了~~来看看为什么?

我们来对swap函数中的语句进行分析:     

     t = *p;             // p中保存的是a 在内存空间中的地址,*p 的值就是a 的值

    *p = *q;           // q中保存的是b 在内存空间中的地址,*q 的值就是b 的值
    *q = t;
所以是对a, b 原始值的操作,就得到了我们想要的结果!!

 

把指针作为函数的接受参数虽然能够进行正常使用,但不易于阅读,难使用。那么来看看下面的方法~~~

     版本五

     //这种方法是通过引用来传递函数参数的;

    //先说说引用是怎么回事吧!! 引用就是别名 语法是: 如 int &rnum = num;  rnum就是num的别名,对rnum 操   作实际就是对num的操作。。

    #include<iostream>
    using namespace std;
    void swap(int &p, int &q)
    {
              int  t;
 
              t = p;
              p = q;
              q = t;
     }
     int main(void)
   {
           int a = 10;
           int b = 20;
 
           swap(a, b);
           cout<<"a = "<<a<<", b = "<<b<<endl;

   }

此时的a = 20, b = 10

知道了引用是怎么回事后问题就简单了吧!! p 是 a 的别名  ; q 是 b 的别名 对p, q 的操作就是对a , b 的操作~~

      如果你有更好的idea,欢迎交流!!

      第一篇博文就这样完成了!!接下来有时间会继续跟朋友们探讨C++,以求共同进步!!

   

 

 

 

  

 

 

 

   

 

 

     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值