C++ 值传递 址传递 引用传递

1:按值传递:

 

    程序如下:

 

view plaincopy to clipboardprint?

#include <iostream>  

using namespace std;  

void swap(int a,int b)//指针保存地址  

{  

int c;  

cout<<"前: a:"<<a<<" b:"<<b<<endl;  

c=a;  

a=b;  

b=c;  

cout<<"后: a:"<<a<<" b:"<<b<<endl;  

}  

int main()  

{  

   int a=3,b=4;  

   cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;  

   swap(a,b);//取地址传递 变量的内存地址  

   cout<<"主程序后:a:"<<a<<" b:"<<b<<endl;  

   return 0;  

#include <iostream>

using namespace std;

void swap(int a,int b)//指针保存地址

{

int c;

cout<<"前: a:"<<a<<" b:"<<b<<endl;

c=a;

a=b;

b=c;

cout<<"后: a:"<<a<<" b:"<<b<<endl;

}

int main()

{

         inta=3,b=4;

         cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;

         swap(a,b);//取地址传递变量的内存地址

         cout<<"主程序后: a:"<<a<<" b:"<<b<<endl;

         return0;

}

 

输出的结果是:

 

主程序前: a:3  b:4

 

前: a:3  b:4

 

后: a:4  b:3

 

主程序前: a:3  b:4

 

主程序的值没有改变,改变的值是栈中的a 和b的副本的值,值传递的时候在栈中拷贝一个变量的副本来操作,这样的话就改变不了以前的值.用的时候要小心.

 

      

 

2:按址传递:

 

这个时候是用地址传递 程序如下:

 

 viewplaincopy to clipboardprint?

#include <iostream>  

using namespace std;  

void swap(int *a,int *b)//指针保存地址  

{  

int c;  

cout<<"前: a:"<<*a<<" b:"<<*b<<endl;  

c=*a;  

*a=*b;  

*b=c;  

cout<<"后: a:"<<*a<<" b:"<<*b<<endl;  

}  

int main()  

{  

   int a=3,b=4;  

   cout<<"主程序前:a:"<<a<<"  b:"<<b<<endl;  

   swap(&a,&b);//取地址传递 变量的内存地址  

   cout<<"主程序后:a:"<<a<<" b:"<<b<<endl;  

   return 0;  

#include <iostream>

using namespace std;

void swap(int *a,int *b)//指针保存地址

{

int c;

cout<<"前: a:"<<*a<<" b:"<<*b<<endl;

c=*a;

*a=*b;

*b=c;

cout<<"后: a:"<<*a<<" b:"<<*b<<endl;

}

int main()

{

         inta=3,b=4;

         cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;

         swap(&a,&b);//取地址传递变量的内存地址

         cout<<"主程序后: a:"<<a<<" b:"<<b<<endl;

         return0;

}

 

 

这个就是按地址传递 在方法swap(&a,&b);的参数中&a,&b都是取地址 那么传递过去的地址由指针来接收所以在定义函数的时候有void swap(int *a,int *b)定义了俩个指针来存放地址,这样就好理解了 swap(){}函数里面的操作都是按指针来操作的*a ,*b

 

这样的话结果就是:

 

 

主程序前: a:3  b:4

 

前: a:3  b:4

 

后: a:4  b:3

 

主程序前: a:4  b:3

 

可以看到结果是改变了,因为直接操作的是a,b的内存地址

 

 

 

3:按别名(引用)传递:

 

 viewplaincopy to clipboardprint?

#include <iostream>  

using namespace std;  

void swap(int &a,int&b)//接收俩个别名  

{  

int c;  

cout<<"前: a:"<<a<<" b:"<<b<<endl;  

c=a;  

a=b;  

b=c;  

cout<<"后: a:"<<a<<" b:"<<b<<endl;  

}  

int main()  

{  

   int a=3,b=4;  

   cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;  

   swap(a,b);//直接传递a b 传递过去的时候由别名接收那么就是自身的别名了  

   cout<<"主程序后:a:"<<a<<" b:"<<b<<endl;  

   return 0;  

#include <iostream>

using namespace std;

void swap(int &a,int &b)//接收俩个别名

{

int c;

cout<<"前: a:"<<a<<" b:"<<b<<endl;

c=a;

a=b;

b=c;

cout<<"后: a:"<<a<<" b:"<<b<<endl;

}

int main()

{

         inta=3,b=4;

         cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;

         swap(a,b);//直接传递a b 传递过去的时候由别名接收 那么就是自身的别名了

         cout<<"主程序后: a:"<<a<<" b:"<<b<<endl;

         return0;

}

 

 

  这样的话接受的参数就是俩个别名,他们分别是主函数中a b的别名,因为别名和自身一样所以结果就改变了

 

主程序前: a:3  b:4

 

前: a:3  b:4

 

后: a:4  b:3

 

主程序前: a:4  b:3

 

可以看到用值传递一不小心就达不到目的了,用地址传递的话写法会比较困难,不小心会出错,用引用传递的话考虑的问题就没有那么多了,我们就可以放心的使用了,写函数的时候用引用,那么调用的时候就不用考虑太多了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值