怎么来调用这个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*, string*&)
可以看到,由于对指针和引用得不熟悉,连编译都过不了。
可见,在C++和C语言的编程中,理解指针是多么重要!
本文旨在抛砖引玉,着重探讨与前面例子相关的:指向指针的引用。
其实,函数:RequestService( string *reqst, string *&Rsp)的第一个参数是普通的指针类型,第二个参数Rsp是一个指向指针的引用 。因此,调用时,第一个参数传递参数地址就行,而第二个参数则需要传递一个指针变量给它。即正确调用方法为:
[cpp]view plaincopyprint?
stringinput="HelpMe";
string*output=NULL;
RequestService(&input,output)
这样,就可以编译通过了。
指向指针的引用是某一指针的别名,同变量的引用一样。引用绝对不是单独存在的,它一定是指示某个已经存在的东西的,它一定是某个已经存在的物体的"别名".
而且它如果被初始化赋值成某个变量后,它就始终是这个变量的替身.对引用的改变就是对这个变量的改变.
指向指针的引用的特殊点在于如下两点:
(1)指向指针的引用,不仅改变了指针所指的对象,也改变了指针本身。
为了方便读者的理解,我们看两种情况,代码稍有不同。
第一种情况:只有普通的引用,
第二种情况,使用了指向指针的引用。
(2)指向指针的引用,可以实现对传递给形参的实参数值的交换。即指向指针的引用可以修改指针的值,在参数传递时是传址。
[cpp]view plaincopyprint?
<prename="code">#include<iostream>
usingnamespacestd;
voidptrswap2(int*&v1,int*&v2)//指向指针的引用是某一指针的别名,同变量的引用一样,可以实现对传递给形参的实参数值的交换
{
int*temp=v2;//指针别名,当然以指针的形式来应用
v2=v1;
v1=temp;
}
voidptrswap1(int*v1,int*v2)//利用指针进行数值交换,改变的只是形参的指向,实参的值保持不变;
{
int*temp=v1;
v2=v1;
v1=v2;
}
intmain(){
inti=10;
intj=20;
int*pi=&i;
int*pj=&j;
cout<<"beforeswapusingpointerasparameter:pi="<<*pi<<"pj="<<*pj<<endl;
ptrswap1(pi,pj);
cout<<"afterswapusingpointerasparameter,thevaluethatpointerpointstodon'tchange"<<endl<<"::pi="<<*pi<<"pj="<<*pj<<endl;
inti2=10;
intj2=20;
int*pi2=&i2;
int*pj2=&j2;
cout<<"beforeswapusingReferenceofpointerasparameter::pi2="<<*pi2<<"pj2="<<*pj2<<endl;
ptrswap2(pi2,pj2);

cout<<"afterswap,thevaluethatpointerpointstochanged:pi2="<<*pi2<<"pj2="<<*pj2<<endl;
return0;
}</pre><br>