华为机试 小结 关于函数传参修改的问题

第一第二道题比较简单,第三道题还好,就是一个递归,但是传参的时候出了个问题,我做了一个flag来标志,但是函数中修改了flag之后,但是退出函数之后,flag并没有改变,想起来,应该是没有传入指针,故此处进行学习。

http://blog.csdn.net/herecles/article/details/6072523

在C++中,如果函数的实参的类型是数据类型比较大的数据类型,这是如果使用一般传参就会有很大的不方便,这是如果能够传递一个地址或者是对原来参数的一个引用对提高性能会有很大的帮助。

         本文研究一下引用传参和指针传参的区别和联系。其实引用传参和指针传参都能够在条用函数内部对源数据进行修改,这是它们的共同点,但是它们也是有区别的。下面是一个例子:

[cpp] view plain copy
 
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. void SwapByPoint(int* x,int* y);      //指针传参函数的声明  
  6.   
  7. void SwapByReference(int &x,int &y);   //引用传参函数的声明  
  8.   
  9.   
  10.   
  11. int main()  
  12.   
  13. {  
  14.   
  15.          int x = 3;  
  16.   
  17.          int y = 5;  
  18.   
  19.          cout<<"转化前: x="<<x<<" y="<<y<<"/n";  
  20.   
  21.     SwapByPoint(&x,&y);    //如果这里使用 SwapByPoint(x,y) 则报错:cannot convert parameter 1 from 'int' to 'int *'  
  22.   
  23.          cout<<"指针传参转换后:x="<<x<<" y="<<y<<"/n";  
  24.   
  25.   
  26.          SwapByReference(x,y); //如果这里用SwapByReference(&x,&y) 则报错 cannot convert parameter 1 from 'int *' to 'int &'  
  27.   
  28.          cout<<"引用传参调用转换后:x="<<x<<" y="<<y<<"/n";  
  29.   
  30.          system("pause");  
  31.   
  32.          return 0;  
  33.   
  34. }  
  35.   
  36.   
  37. /*交换函数 使用指针传参*/  
  38.   
  39. void SwapByPoint(int *x,int *y)  
  40.   
  41. {  
  42.   
  43.          int temp = *x;  
  44.   
  45.          *x = *y;  
  46.   
  47.          *y = temp;  
  48.   
  49. }  
  50.   
  51.   
  52. /* 
  53.  
  54. 使用引用传参 
  55.  
  56. */  
  57.   
  58. void SwapByReference(int &x,int &y)  
  59.   
  60. {  
  61.   
  62. int temp = x;  
  63.   
  64. x = y;  
  65.   
  66. y = temp;  
  67.   
  68. }  

指针传参和引用传参的效果是一样的。

它们的差别个人认为:

  • 指针传参传递的是一参数(这里是Int实参)的地址,这样,虽然实参和形参不一样,但是它们只想的地址是一样的,所以对相同地址的数的操作会影响到原来的数。
  • 引用传参传递的是一个参数本身,但是在调用函数中,把保存它们的地址的值做了交换。

两种传参方式的调用必须是上述这样的,否则会报错,在相应的代码中有提示…..

原文地址:https://www.cnblogs.com/vipwtl/p/5289832.html