理解指向指针的引用

      在做项目时,用到第三方的API:RequestService( string *reqst, string *&Rsp)

      怎么来调用这个API呢?由于对指针的使用不熟悉,分别作了如下尝试:

(1)想当然,把2个参数都当作普通的指针:

string input="Help Me";

string output;

RequestService( &input, &output)

error: no matching function for call to ‘RequestService(string *,string*)’
note: candidates are: virtual int RequestService(string*, string*&)

 

(2)把第二个参数当成指向指针的指针

string input="Help Me";

string *output = NULL;

RequestService( &input, &output)

error: no matching function for call to ‘RequestService(string *,string**)’
note: candidates are: virtual int RequestService(string*, stri
ng*&)

      可以看到,由于对指针和引用得不熟悉,连编译都过不了。

      可见,在C++和C语言的编程中,理解指针是多么重要!

      本文旨在抛砖引玉,着重探讨与前面例子相关的:指向指针的引用。

      其实,函数:RequestService( string *reqst, string *&Rsp)的第一个参数是普通的指针类型,第二个参数Rsp是一个指向指针的引用 。因此,调用时,第一个参数传递参数地址就行,而第二个参数则需要传递一个指针变量给它。即正确调用方法为:

string input="Help Me";

string *output = NULL;

RequestService( &input, output)

    这样,就可以编译通过了。

     指向指针的引用是某一指针的别名,同变量的引用一样。引用绝对不是单独存在的,它一定是指示某个已经存在的东西的,它一定是某个已经存在的物体的"别名".  
  而且它如果被初始化赋值成某个变量后,它就始终是这个变量的替身.对引用的改变就是对这个变量的改变.  

指向指针的引用的特殊点在于如下两点:

(1)指向指针的引用,不仅改变了指针所指的对象,也改变了指针本身。

        为了方便读者的理解,我们看两种情况,代码稍有不同。

第一种情况,使用了指向指针的引用。

第二种情况:只有普通的引用,

 

 

 

对第一个case而言:由于p是指向tmp指针的引用,

不仅改变了p指针所指的对象b,也改变了tmp指针本身。

所以结果为:

 

a=1,b=*tmp=*p=5

 

对第二个case而言:由于p是普通的指针,所以结果为:p改变了指向,并改变了指向的值,但它不能改变它一开始指向的初始值tmp,所以结果为:

a=1, b=5,*p=5,*tmp=1

(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;
}

 

 

 


 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值