C++中传值、传址与传引用的区别

本文详细探讨了C++中参数传递的三种方式:传值、传址与传引用。传值传递会复制实参到形参,不改变原变量;传址传递通过地址传递,形参改变会影响实参;传引用传递类似传址,但引用是别名,修改形参直接影响实参。理解这三种方式对于优化代码性能和避免意外修改至关重要。
1、参数传递的概念 
所谓参数传递就是用函数调用所给出的实参(实际参数)函数定义所给出的形参(形式参数)设置初始值的过程。
在c++中,调用函数时有三种参数传递方式,分别为:
(1)传值调用;
(2)传址调用(即是传指针);
(3)传引用
    总体上参数传递可以分为两类,由形参的类别决定:值调用与引用调用。除了定义为引用类型的形参外,其他类型的形参都是对应着值调用。指针传递也是值调用,只是它是值传递的是地址。下面对这三种参数传递方式进行详细的说明:
值传递:
    值传递时,实参被拷贝了一份,然后在函数体内使用,函数体内修改参数变量时修改的只是实参的一份拷贝,而实参本身没有改变,所以如果想要在调用的函数中修改实参的值,使用值传递不能达到其目的,这时只能使用引用或者指针传递。下面代码可以说明:
void swap(int a ,int b )      //此时传递的实参i与j的值在这里只是一份拷贝,交换的是他们的拷贝的值,而不是实参本身,出了这个函数的作用域之后,他们的拷贝值被销毁,因此i与j的值根本就没有交换。
{
             int temp = 0;
            temp = a;
             a = b;                                                            
             b = temp;
}

int main()
{
             void swap( int, int);
             int i = 10;
             int j = 20;
            swap(i, j);
            cout << "i=" << i << endl;
            cout << "j=" << j << endl;
            system( "pause");
             return 0;

}




引用传递:
int main()
{
             void swap( int &, int &);
             int i = 10;
             int j = 20;
            swap(i, j);
             return 0;
}
void swap(int &a , int &b )
{
             int temp;
            temp = a;
             a = b;
             b = temp;
}
下面是此段代码的汇编代码:
int main()
{
00824410  push        ebp 
00824411  mov         ebp,esp 
00824413  sub         esp,0DCh 
00824419  push        ebx 
0082441A  push        esi 
0082441B  push        edi 
0082441C  lea         edi,[ebp-0DCh] 
00824422  mov         ecx,37h 
00824427  mov         eax,0CCCCCCCCh 
0082442C  rep stos    dword ptr es:[edi] 
0082442E  mov         eax,dword ptr ds:[0082F000h] 
00824433  xor         eax,ebp 
00824435  mov         dword ptr [ebp-4],eax 
            void swap(int &, int &);
            int i = 10;
00824438  mov         dword ptr [i],0Ah 
            int j = 20;
0082443F  mov         dword ptr [j],14h 
            swap(i, j);
00824446  lea         eax,[j] 
00824449  push        eax 
0082444A  lea         ecx,[i] 
0082444D  push        ecx 
0082444E  call        swap (08214A1h) 
00824453  add         esp,8 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值