指针引用(转载)
? ?在做項(xiàng)目時(shí),用到第三方的API:RequestService( string *reqst, string *&Rsp)
? ? ? 怎么來調(diào)用這個(gè)API呢?由于對(duì)指針的使用不熟悉,分別作了如下嘗試:
(1)想當(dāng)然,把2個(gè)參數(shù)都當(dāng)作普通的指針:
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)把第二個(gè)參數(shù)當(dāng)成指向指針的指針
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*&)? ? ? 可以看到,由于對(duì)指針和引用得不熟悉,連編譯都過不了。
? ? ? 可見,在C++和C語言的編程中,理解指針是多么重要!
? ? ? 本文旨在拋磚引玉,著重探討與前面例子相關(guān)的:指向指針的引用。
? ? ? 其實(shí),函數(shù):RequestService( string *reqst, string *&Rsp)的第一個(gè)參數(shù)是普通的指針類型,第二個(gè)參數(shù)Rsp是一個(gè)指向指針的引用 。因此,調(diào)用時(shí),第一個(gè)參數(shù)傳遞參數(shù)地址就行,而第二個(gè)參數(shù)則需要傳遞一個(gè)指針變量給它。即正確調(diào)用方法為:
string input="Help Me"; string *output = NULL; RequestService( &input, output) ? ? 這樣,就可以編譯通過了。
? ? ?指向指針的引用是某一指針的別名,同變量的引用一樣。引用絕對(duì)不是單獨(dú)存在的,它一定是指示某個(gè)已經(jīng)存在的東西的,它一定是某個(gè)已經(jīng)存在的物體的"別名". ?
? 而且它如果被初始化賦值成某個(gè)變量后,它就始終是這個(gè)變量的替身.對(duì)引用的改變就是對(duì)這個(gè)變量的改變. ?
指向指針的引用的特殊點(diǎn)在于如下兩點(diǎn):
(1)指向指針的引用,不僅改變了指針?biāo)傅膶?duì)象,也改變了指針本身。
? ? ? ? 為了方便讀者的理解,我們看兩種情況,代碼稍有不同。
第一種情況:只有普通的引用,
第二種情況,使用了指向指針的引用。
??
(2)指向指針的引用,可以實(shí)現(xiàn)對(duì)傳遞給形參的實(shí)參數(shù)值的交換。即指向指針的引用可以修改指針的值,在參數(shù)傳遞時(shí)是傳址。
#include <iostream>using namespace std;void ptrswap2(int *&v1,int *&v2)//指向指針的引用是某一指針的別名,同變量的引用一樣,可以實(shí)現(xiàn)對(duì)傳遞給形參的實(shí)參數(shù)值的交換 { int *temp=v2;//指針別名,當(dāng)然以指針的形式來應(yīng)用 v2=v1; v1=temp; } void ptrswap1(int *v1,int *v2)//利用指針進(jìn)行數(shù)值交換,改變的只是形參的指向,實(shí)參的值保持不變; { 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); //會(huì)編譯出錯(cuò),一定要傳個(gè)指針才行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); //會(huì)編譯出錯(cuò),一定要傳個(gè)指針才行cout<<"after: pi2="<<*pi2<<" pj2="<<*pj2<<endl; cout<<"i = "<<i<<"j="<<j<<endl;//值沒有變,變的只是傳入指針的值return 0; }?
總結(jié)
 
                            
                        - 上一篇: Vim中快捷键笔记
- 下一篇: 如何修炼成某一领域的高手
