C++:函数参数传递-值传递、指针传递、引用传递

2025-11-06 01:52:55

1、参数传递:

值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值;

指针传递:传递的是一个外部实参的地址,当被调用函数的形参发生变化时,实参也会变化;

引用传递:实参和形参通过引用绑定;形参的任何改动都会直接影响到实参;

【注】:当某种类型不支持拷贝操作时,或拷贝大的类类型对象时比较低效,函数只能通过引用形参访问该类型的对象;

【注】:如果函数无须改变引用形参的值,最好将其声明为常量引用;

C++:函数参数传递-值传递、指针传递、引用传递

2、示例:对两个整数进行交换;

代码如下:

#include "stdafx.h"

#include <iostream>

using namespace std;

//值传递

void swap1(int p,int q)

{

       int temp;

       temp=p;

       p=q;

       q=temp;

}

//指针传递,函数体内只有指针值的变化

void swap2(int *p,int *q)

{

    int temp;

    temp=*p;

    *p=*q;

    *q=temp;

 }

 //指针传递,函数体内只有指针的变化

void swap3(int *p,int *q)

{

       int *temp;

    temp=p;

    p=q;

    q=temp;

}

//引用传递

void swap4(int &p,int &q)

{

       int temp;

    temp=p;

    p=q;

    q=temp;

}

int main()

{

       int a=1,b=2;

      

       cout<<"before swap ..."<<endl;

       cout<<"a = "<<a<<endl;

       cout<<"b = "<<b<<endl;

    swap1(a,b);

    //swap2(&a,&b);

    //swap3(&a,&b);

    //swap4(a,b);

       cout<<"after swap ..."<<endl;

       cout<<"a = "<<a<<endl;

       cout<<"b = "<<b<<endl;

       system("pause");

    return 0;

}

C++:函数参数传递-值传递、指针传递、引用传递

3、值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值;

//值传递

void swap1(int p,int q)

{

       int temp;

       temp=p;

       p=q;

       q=temp;

}

int main()

{

       int a=1,b=2;

       cout<<"before swap ..."<<endl;

       cout<<"a = "<<a<<endl;

       cout<<"b = "<<b<<endl;

       cout<<"a 的地址= "<<&a<<endl;

       cout<<"b 的地址= "<<&b<<endl;

    swap1(a,b);

    //swap2(&a,&b);

    //swap3(&a,&b);

    //swap4(a,b);

       cout<<"after swap ..."<<endl;

       cout<<"a = "<<a<<endl;

       cout<<"b = "<<b<<endl;

       cout<<"a 的地址= "<<&a<<endl;

       cout<<"b 的地址= "<<&b<<endl;

       system("pause");

    return 0;

}

C++:函数参数传递-值传递、指针传递、引用传递

4、指针传递一:swap2()

swap2和swap3都是指针传递,

swap2函数体内交换了p和q指向地址的值;

//指针传递,函数体内只有指针值的变化

void swap2(int *p,int *q)

{

    int temp;

    temp=*p;

    *p=*q;

    *q=temp;

 }

int a=1,b=2;

swap2(&a,&b);//指针传递

解释:

实参a的值为1,a的地址为CE4;

实参b的值为2,b的地址为D04;

指针传递过程中传递的是a,b的地址;

形参p是指向a地址CE4的指针,p的地址为CE0;

形参q是指向b地址D04的指针,q的地址为CE8;

此时,解引用指针*p的值为1;

解引用指针*q的值为2;

故swap2函数体内交换了p和q指向地址的值;

C++:函数参数传递-值传递、指针传递、引用传递

5、指针传递二:swap3()

swap3函数体内交换了p和q指向的地址

//指针传递,函数体内只有指针的变化

void swap3(int *p,int *q)

{

       cout<<"before swap ..."<<endl;

       cout<<"p 的地址= "<<&p<<endl;

       cout<<"q 的地址= "<<&q<<endl;

       cout<<"*p = "<<*p<<endl;

       cout<<"*q = "<<*q<<endl;

       int *temp;

    temp=p;

    p=q;

    q=temp;

       cout<<"after swap ..."<<endl;

       cout<<"p 的地址= "<<&p<<endl;

       cout<<"q 的地址= "<<&q<<endl;

       cout<<"*p = "<<*p<<endl;

       cout<<"*q = "<<*q<<endl;

}

//调用

int a=1,b=2;

swap3(&a,&b);//指针传递

解释:

实参a的值为1,a的地址为8C4;

实参b的值为2,b的地址为8E4;

指针传递过程中传递的是a,b的地址;

形参p是指向a地址8C4的指针,*p值为1;

形参q是指向b地址8E4的指针,*q值为2;

此时对指针p,q的值即8C4,8E4进行交换,

交换之后,

形参p是指向a地址8E4的指针,*p值为2;

形参q是指向b地址8C4的指针,*q值为1;

但a和b地址中的值并未发生变化,故a和b不变;

故swap3函数体内交换了p和q指向的地址;

C++:函数参数传递-值传递、指针传递、引用传递

6、引用传递:实参和形参通过引用绑定;形参的任何改动都会直接影响到实参;

//引用传递

void swap4(int &p,int &q)

{

       cout<<"before swap ..."<<endl;

       cout<<"p = "<<p<<endl;

       cout<<"q = "<<q<<endl;

       cout<<"p = "<<&p<<endl;

       cout<<"q = "<<&q<<endl;

       int temp;

    temp=p;

    p=q;

    q=temp;

       cout<<"after swap ..."<<endl;

       cout<<"p = "<<p<<endl;

       cout<<"q = "<<q<<endl;

       cout<<"p = "<<&p<<endl;

       cout<<"q = "<<&q<<endl;

}

//函数调用

int a=1,b=2;

swap3(a,b);//指针传递

解释:

实参a的值为1,a的地址为744;

实参b的值为2,b的地址为764;

引用传递:将实参和形参绑定在一起;

形参p的值为1,p的地址为744;

形参q的值为2,q的地址为764;

交换后,

形参p的值为2,p的地址为744;

形参q的值为1,q的地址为764;

实参a的值为2,a的地址为744;

实参b的值为1,b的地址为764;

故swap4引用传递等同于对实参的操作,即传递的不是实参的副本,而就是实参;

C++:函数参数传递-值传递、指针传递、引用传递

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢