【C++】关于调用函数时的三种参数传递方式(传值、传引用、传地址)的区别
目录
【C++】关于调用函数时的三种参数传递方式(传值、传引用、传地址)的区别
1.传值方式(形参为普通变量类型):
函数的形参的值是实参的一份拷贝,函数体内修改形参时修改的只是“拷贝”而已,并不会对实参产生影响,即实参本身是没有改变的。如果想要在调用的函数中修改实参的值,使用值传递不能达到修改的目的,所以这时只能使用传引用或传指针的方式实现,代码实现如下(可以拷贝代码到编译器验证结果哦):
在下面的代码中,对形参中的a,b变量的修改不会影响到主函数中a,b的值(是两个不同作用域中的不同变量,a与a(b与b)是两个不同的地址空间。
#include<iostream>
using namespace std;
void exchange(int a, int b)
{
int z;
z = a;
a = b;
b = z;
cout << "a的值为:" << a << "b的值为:" << b << endl;
}
int main()
{
int a = 5;
int b = 8;
//调用exchange函数前a与b的值
cout << "a的值为:" << a << "b的值为:" << b << endl; //a为5,b为8
exchange(a, b); //a为8,b为5
//调用exchange函数后a与b的值
cout << "a的值为:" << a << "b的值为:" << b << endl; //a为5,b为8
return 0;
}
1.传值方式结果:
2.传引用方式(函数形参为引用类型) :
在这种传递方式中,形参是引用类型的变量,其实它就是实参的一个别名,在被调用的函数中(函数体中),对引用变量的所有操作都等价于对实参的操作。这样,整个函数执行完毕后,原来的实参的值就将会发生改变。
在下面代码中,c,d分别为实参a,b的别名,修改c,d的值就相当于修改a,b的值。
#include<iostream>
using namespace std;
void exchange(int &c, int &d)
{
int z;
z = c;
c = d;
d = z;
//c,d分别为实参a,b的别名,修改c,d的值就相当于修改a,b的值
cout << "a的值为:" << c << "b的值为:" << d << endl;
}
int main()
{
int a = 5;
int b = 8;
//调用exchange函数前a与b的值
cout << "a的值为:" << a << "b的值为:" << b << endl; //a为5,b为8
exchange(a, b); //a为8,b为5
//调用exchange函数后a与b的值
cout << "a的值为:" << a << "b的值为:" << b << endl; //a为8,b为5
return 0;
}
2.传引用方式结果:
3.传地址方式(函数形参是指针):
在这种传递方式中,实参是变量的地址,形参是指针类型的变量,在函数体中对指针变量的操作,就是对实参(变量地址)所对应的变量(指向对应地址中内存存放的值)的操作,函数调用结束后,原函数中的变量的值将会发生改变。被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
在下面代码中,指针 e, f 分别接收a,b的地址,修改 e,f 所指向的值就是修改a,b的值。
#include<iostream>
using namespace std;
void exchange(int* e, int* f)
{
int z;
z = *e;
*e = *f;
*f = z;
cout << "a的值为:" << *e << "b的值为:" << *f << endl;
//cout<<a<<" "<<b<<endl; 输出a,b指针所指向的地址
cout << e << " " << f << endl;
}
int main()
{
int a = 5;
int b = 8;
//调用exchange函数前a与b的值
cout << "a的值为:" << a << "b的值为:" << b << endl; //a为5,b为8
//调用exchange函数时,实参位置需要用取地址方式,
//因为exchange函数形参是指针类型,指针是一个对象,存放的是变量的地址
exchange(&a, &b); //a为8,b为5
//调用exchange函数后a与b的值
cout << "a的值为:" << a << "b的值为:" << b << endl; //a为8,b为5
return 0;
}
3.传指针方式结果:
4. 这里也有关到标准库里的swap()函数:
#include<iostream>
using namespace std;
int main()
{
int a=5;
int b=8;
cout <<"使用swap函数前,a的值为:"<< a <<"b的值为:"<< b << endl; //a为5,b为8
swap(a,b);
cout <<"使用swap函数后,a的值为:"<< a <<"b的值为:"<< b << endl; //a为8,b为5
return 0;
}
4.使用swap()函数的结果:
一般来说,传址方式和传引用方式比传值效率高。因为传值中,形参进行了对实参的拷贝 。
来自一个学习C++的菜鸟的学习历程,如有错误,望指正(╯﹏╰)。(可以的话,我们可以互相学习。 ̄ω ̄)