本章旨在帮助理解掌握值传递、指针传递、引用传递三种方式。
值传递:形参是实参的拷贝,改变形参的值不会影响外部实参的值,从被调用函数的角度来说,值传递是单向的,即从实参——>形参,参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者,采用值传递。
指针传递:形参为指向地址的指针,当对形参的指向操作时,就相当于对实参本身进行操作。
引用传递:形参相当于实参的别名。对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。
#include<iostream>
using namespace std;
void change1(int n)
{
cout<<"值传递:"<<&n<<endl;
n++;
}
void change2(int& n)
{
cout<<"引用传递:"<<&n<<endl;
n++;
}
void change3(int* n)
{
cout<<"指针传递:"<<n<<endl;
*n=*n+1;
}
int main()
{
int n=10;
cout<<"实参的地址:"<<&n<<endl;
change1(n);
cout<<"after change1() n="<<n<<endl;
change2(n);
cout<<"after change2() n="<<n<<endl;
change3(&n);
cout<<"after change3() n="<<n<<endl;
return 0;
}
程序输出:
实参的地址:0x7fff948c0404
值传递:0x7fff948c03dc
after change1() n=10
引用传递:0x7fff948c0404
after change2() n=11
指针传递:0x7fff948c0404
after change3() n=12
结论:
从上述实验可以看出,实参的地址为ox7fff948c0404
1)当采用值传递时,函数操作地址是ox7fff948c03dc,并不是实参本身,所以对它进行操作并不能改变实参的值。即是说,函数操作是建立了另外一个临时空间。)
2)当采用引用传递时,操作地址就是实参地址,只是相当于实参的一个别名,对它的操作就是对实参的操作。
3)当采用指针传递时,操作地址也是实参地址。
问题:引用传递与指针传递的区别?
规则:
(1)引用被创建的同时初始化;指针在任何时候都可以被初始化。
(2)引用不能有NULL引用,引用必须与合法的存储单元关联;指针可以NULL
(3)一旦引用被初始化,就不能改变引用的关系;指针则可以随时改变所指的对象。