值传递:形参是实参的副本(复制、拷贝),形参值的改变不会影响实参的值,大家初学函数时接触到的第一个传参例子都为这种。
指针传递:形参是指针类型,形参作指针运算后指向的就是实参,所以会影响实参的值。
引用传递:在调用函数时将实参的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实参的值。值得注意的是:引用传递是C++才有的语法,C语言中是没有的。引用的意思是指 C++ 允许直接操作传入的变量,即直接引用通过参数传入的变量。
关于引用传递的详细介绍见 https://blog.youkuaiyun.com/wenhao_ir/article/details/145422877
引用传递与指针传递的区别:
二者实质上都是在利用指针进行操作,不同的是,指针传递明确要求传递的实参就是指针,而引用传递不需要实参是指针,也就是说对于引用传递来说,在主调函数和被调函数中,都不涉及到指针的定义。
引用传递在底层是通过指针实现的,但引用提供了更高级的抽象,使代码更简洁和安全。
引用传递在 C++ 中被广泛使用,主要因为它有以下优点:
1、语法简洁:不需要显式使用 * 和 & 操作符。
2、安全性高:引用不能为空,避免了空指针问题。
3、可读性强:代码更直观,易于理解。
关于引用传递的详细介绍见 https://blog.youkuaiyun.com/wenhao_ir/article/details/145422877
下面对三种情况分别举例:
值传递的例子:
void swap(int a,int b)//形参也可以是对象之类的哦
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return 0;
}
运行结果是2,1 和1,2,函数swap()没有改变实参x、y的值。
指针传递的例子:
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
cout<<*a<<’ ‘<<*b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(&x,&y);
cout<<x<<’ ‘<<y<<’\n’;
}
运行结果是:2,1和2,1,函数swap()改变了实参x、y的值。
引用传递的例子:
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return 0;
}
运行结果是:2,1和2,1,函数swap()改变了实参x、y的值。
扩展阅读: