C/C++函数参数传递时值传递、指针传递、引用传递的区别是什么?
值传递:形参是实参的副本(复制、拷贝),形参值的改变不会影响实参的值,大家初学函数时接触到的第一个传参例子都为这种。
指针传递:形参是指针类型,形参作指针运算后指向的就是实参,所以会影响实参的值。
引用传递:在调用函数时将实参的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实参的值。
引用传递与指针传递的区别:
引用传递是把实参的内存引用空间(所谓引用空间,即数据在内存中的地址)传递给形参,形参与实参具有相同的引用空间,引用传递在函数定义和调用时并没有用到指针运算符。
而指针传递传递的是指针值,实参和形参都是指针,指针传递时要用到指针运算符进行相关数据的操作。指针操作是容易出问题的,通常我们能避免指针操作就避免指针操作,所以通常我们用的都是值传递和引用传递。
下面对三种情况分别举例:
值传递的例子:
[C++] 纯文本查看 复制代码 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的值。
指针传递的例子:
[C++] 纯文本查看 复制代码 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的值。
引用传递的例子:
[C++] 纯文本查看 复制代码 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的值。
扩展阅读:
为什么引用传递的参数名前通常都用const作了修饰?
|