指针参数传递:
指针参数传递本质上是值传递 ,它所传递的是⼀个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从⽽形成了实参的⼀个 副本(替身) 。
值传递的特点是:被调函数对形式参数的任何操作都是作为局部变量进⾏的,不会影响主调函数的实参变ᰁ的值 (形参指针变了,实参指针不会变)。
void Swap(int *x, int *y)
{
int *tmp;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10,b = 20;
cout<<"a = "<<a<<" b = "<<b<<endl;
Swap(&a,&b);
cout<<"Swap后"<<endl;
cout<<"a = "<<a<<" b = "<<b<<endl;
}
结果展示:
引⽤参数传递:
引⽤参数传递过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数 放进来的实参变量的地址 。被调函数对 形参(本体) 的任何操作都被处理成间接寻址,即通过栈中存放的地址访问。
主调函数中的实参变量(根据别名找到主调函数中的本体)。因此,被调函数对形参的任何操作都会影响主调函数 中的实参变量
void Swap(int &x, int &y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10,b = 20;
cout<<"a = "<<a<<" b = "<<b<<endl;
Swap(a,b);
cout<<"Swap后"<<endl;
cout<<"a = "<<a<<" b = "<<b<<endl;
}
结果展示:
区别:
引⽤传递和指针传递是不同的 ,虽然他们都是在被调函数栈空间上的⼀个局部变量,但是任何对于引⽤参数的处理 都会通过⼀个间接寻址的⽅式操作到主调函数中的相关变量。⽽对于指针传递的参数, 如果改变被调函数中的指针地址,它将应⽤不到主调函数的相关变量 。如果想通过指针参数传递来改变主调函数中的相关变量(地址),那就 得使⽤指向指针的指针或者指针引⽤。
从编译的⻆度来讲 ,程序在编译时分别将指针和引⽤添加到符号表上,符号表中记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,⽽引⽤在符号表上对应的地址值为引⽤对象的地址值 (与实参名字不同,地址相同)。符号表⽣成之后就不会再改,因此 指针可以改变其指向的对象(指针变量中的值 可以改),⽽引⽤对象则不能修改