指针引用(转载)
? ?在做項目時,用到第三方的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*, string*&)? ? ? 可以看到,由于對指針和引用得不熟悉,連編譯都過不了。
? ? ? 可見,在C++和C語言的編程中,理解指針是多么重要!
? ? ? 本文旨在拋磚引玉,著重探討與前面例子相關的:指向指針的引用。
? ? ? 其實,函數:RequestService( string *reqst, string *&Rsp)的第一個參數是普通的指針類型,第二個參數Rsp是一個指向指針的引用 。因此,調用時,第一個參數傳遞參數地址就行,而第二個參數則需要傳遞一個指針變量給它。即正確調用方法為:
string input="Help Me"; string *output = NULL; RequestService( &input, output) ? ? 這樣,就可以編譯通過了。
? ? ?指向指針的引用是某一指針的別名,同變量的引用一樣。引用絕對不是單獨存在的,它一定是指示某個已經存在的東西的,它一定是某個已經存在的物體的"別名". ?
? 而且它如果被初始化賦值成某個變量后,它就始終是這個變量的替身.對引用的改變就是對這個變量的改變. ?
指向指針的引用的特殊點在于如下兩點:
(1)指向指針的引用,不僅改變了指針所指的對象,也改變了指針本身。
? ? ? ? 為了方便讀者的理解,我們看兩種情況,代碼稍有不同。
第一種情況:只有普通的引用,
第二種情況,使用了指向指針的引用。
??
(2)指向指針的引用,可以實現對傳遞給形參的實參數值的交換。即指向指針的引用可以修改指針的值,在參數傳遞時是傳址。
#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=v2; v2=v1; v1=temp; } int main() { int i=10; int j=20; int *pi=&i; int *pj=&j; cout<<"before: pi="<<*pi<<" pj="<<*pj<<endl; ptrswap1(pi,pj); //ptrswap1(&i,&j); //會編譯出錯,一定要傳個指針才行cout<<"after:"<<" pi="<<*pi<<" pj="<<*pj<<endl; cout<<"i = "<<i<<"j="<<j<<endl;//值沒有變int i2=10; int j2=20; int *pi2=&i2; int *pj2=&j2; cout<<"before: pi2="<<*pi2<<" pj2="<<*pj2<<endl; ptrswap2(pi2,pj2); //ptrswap2(&i2,&j2); //會編譯出錯,一定要傳個指針才行cout<<"after: pi2="<<*pi2<<" pj2="<<*pj2<<endl; cout<<"i = "<<i<<"j="<<j<<endl;//值沒有變,變的只是傳入指針的值return 0; }?
總結
- 上一篇: Vim中快捷键笔记
- 下一篇: 如何修炼成某一领域的高手