C++语言中,函数的参数和返回值的传递方式有3种:引用传递、指针传递和值传递。
1、引用传递
引用传递传递的是引用对象的内存地址。
引用传递的特点是:被调函数对形参的任何操作都会影响主调函数中的实参变量。
举例说明:
#include<iostream> using namespace std; void swap3(int &p,int &q) { int temp; temp =p; p=q; q=temp; cout<<p<<" "<<q<<endl; } int main() { int x=1,y=2; swap3(x,y); cout<<x<<" "<<y<<endl; }该函数的功能就是交换x和y。
2、指针传递
指针是用来控制对象的内存地址的,它指向单个对象的地址,除了void指针类型外,指针的数据类型与所指向地址的变量数据类型须保持一致。
指针传递只需交换地址即可,举例如下:
#include<iostream> using namespace std; void swap2(int *p,int *q) { int temp; temp =*p; *p=*q; *q=temp; cout<<p<<" "<<q<<endl; } int main() { int x=1,y=2; swap2(&x,&y); cout<<x<<" "<<y<<endl; }该函数的功能就是交换x和y。
3、值传递
值传递是指将要传递的值作为一个副本传递。
在函数调用时,实参把它的值传递给对应的形参,方法执行中形参值不影响实参,即实参的值不会发生改变。即值传递的特点:被调函数对形参的任何操作都是作为局部变量进行的,不会更改主调函数的实参变量的值。
举例说明:
#include<iostream> using namespace std; void swap1(int p,int q) { int temp; temp =p; p=q; q=temp; cout<<p<<" "<<q<<endl; } int main() { int x=1,y=2; swap1(x,y); cout<<x<<" "<<y<<endl; }在此例子中,swap1输出的p和q分别是2,1,但是主函数中输出的值仍不变,分别为1和2。
4、引用传递、指针传递和值传递的区别与联系
(1)、值传递与引用的区别
值传递传递的是值的一个副本,函数对形参的操作不会影响实参的值;而引用传递传递的是引用对象的地址,函数的形参操作会直接影响实参的值,实参的值随着形参的值的改变而改变
(2)、指针与引用的区别
指针是一个实体,而引用是一个别名,指针可以为空,即空指针,但引用不能为空;
引用初始化时必须指向一个对象,之后不能变(但是对象其内容可变),而指针可变;
指针使用前须测试其合法性,防止为空,但引用不要测试其合法性;
引用无需解引用,但指针需要解引用;
sizeof引用得到的是所指对象的大小,而sizeof指针得到的是指针本身的大小,即对象地址的大小;
指针自增与引用自增意义不一样;
在内存分配上,程序为指针变量分配内存区域,而引用不需要分配内存区域等。