指向指针的引用是某一指针的别名,同变量的引用一样。引用绝对不是单独存在的,它一定是指示某个已经存在的东西的,它一定是某个已经存在的物体的"别名".
而且它如果被初始化赋值成某个变量后,它就始终是这个变量的替身.对引用的改变就是对这个变量的改变.
指向指针的引用的特殊点在于如下两点:
(1)指向指针的引用,不仅改变了指针所指的对象,也改变了指针本身。
为了方便读者的理解,我们看两种情况,代码稍有不同。
第一种情况,使用了指向指针的引用。
第二种情况:只有普通的引用,
重点 : 上图结果反了,对于左边例子,p是temp指针的引用,也即temp的别名,当改变p指向时,temp的指向也会跟着变!
(2)指向指针的引用,可以实现对传递给形参的实参数值的交换。即指向指针的引用可以修改指针的值,在参数传递时是传址。
读者看详细分析以下例子进一步学习:
- <pre class="cpp" name="code">#include<iostream>
- using namespace std;
- void ptrswap2(int *&v1,int *&v2)//指向指针的引用是某一指针的别名,同变量的引用一样,可以实现对传递给形参的实参数值的交换
- {
- int *temp=v2;//指针别名,当然以指针的形式来应用
- v2=v1;
- v1=temp;
- }
- void ptrswap1(int *v1,int *v2)//利用指针进行数值交换,改变的只是形参的指向,实参的值保持不变;
- {
- int *temp=v1;
- v2=v1;
- v1=v2;
- }
- int main(){
- int i=10;
- int j=20;
- int *pi=&i;
- int *pj=&j;
- cout<<"before swap using pointer as parameter: pi="<<*pi<<" pj="<<*pj<<endl;
- ptrswap1(pi,pj);
- cout<<"after swap using pointer as parameter, the value that pointer points to don't change"<<endl<<":: pi="<<*pi<<" pj="<<*pj<<endl;
- int i2=10;
- int j2=20;
- int *pi2=&i2;
- int *pj2=&j2;
- cout<<"before swap using Reference of pointer as parameter:: pi2="<<*pi2<<" pj2="<<*pj2<<endl;
- ptrswap2(pi2,pj2);
- cout<<"after swap, the value that pointer points to changed: pi2="<<*pi2<<" pj2="<<*pj2<<endl;
- return 0;
- }