青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

Blog @ Blog

當(dāng)華美的葉片落盡,生命的脈絡(luò)才歷歷可見。 -- 聶魯達(dá)

常用鏈接

統(tǒng)計

積分與排名

BBS

Blog

Web

最新評論

[轉(zhuǎn)]深入C++指針

本篇是第一篇,介紹指針的本質(zhì)是什么。

在相當(dāng)一部分的C++教程中,講到指針時,基本上都會舉swap(int a,int b)這個 數(shù)據(jù)交換的例子。我也同樣愿意舉這個例子作為講述指針的開始。

下面是類的代碼內(nèi)容:

//……限于篇幅,只留說明問題的部分內(nèi)容……

定義部分:

public:

           
void swap(int a,int b);

實現(xiàn)部分:

void CPointerResearch::swap(int x,int y){

           
int nTmp = x;

           x 
= y;

           y 
= nTmp;

}

下面是測試數(shù)據(jù)及結(jié)果:

輸入:

100 200

輸出(執(zhí)行swap函數(shù)后):

100 200

Press any key to continue

 

可以很清楚的看出,并沒有實現(xiàn)數(shù)據(jù)交換。

我們來假想一下程序員寫這樣程序時的心里:有兩個小框,甲框放數(shù)字為100的卡片,乙框放數(shù)字為200的卡片,現(xiàn)將兩張卡片交換一下位置,變成甲框存放數(shù)字為200的卡片,乙框存放數(shù)字為100的卡片。

這樣的想法有問題嗎?答案很明確,一點點問題都沒有!想法完全正確,他(她)只要確實是這樣做的,卡片交換就一定能成功。但為什么上面的程序模擬這樣的執(zhí)行過程,結(jié)果卻不是想要的呢?要想徹底弄明白這個問題,我們必須認(rèn)識問題的根本,即這個問題的本質(zhì)是什么,這才是真正解決問題。

我們來深入分析一下上面那個看似簡單的假想情景。第一,有兩個框,這是確定的事實,毋庸置疑。第二,框里都裝有卡片,并且上面的數(shù)字不同,這個是不爭的事實。第三,交換卡片過程中,雖然兩個框都沒挪動,但里面的卡片都有挪動。第四,卡片挪動是從一個框挪到另一個框。正是有了這四點作保證,卡片才得以成功交換。換句話說,上面的數(shù)據(jù)交換程序的執(zhí)行交換過程如果滿足這四個條件的話,計算機(jī)執(zhí)行后輸出的結(jié)果就一定是我們期待的正確結(jié)果。那么,至此出錯原因已很明確,就是計算機(jī)執(zhí)行程序的過程中,上面這四點至少有一點一定不符合。下面一一分析。

第一, 從輸入條件看。

輸入條件是int a =100;int b= 200;從這兩個C++語句我們可以看出,兩個“框”已經(jīng)有了,分別是ab,也就是說具備了第一個條件。此外,甲框(a)放了數(shù)字為100的卡片(int a=100;, 乙框(b)放了數(shù)字為200的卡片(int b=200;),這說明第二個條件也具備。從輸入條件已經(jīng)看不出什么其它的有用的信息。至此我們已經(jīng)可以判斷出問題出在后兩個條件有不滿足的地方。

第二, swap函數(shù)體看。

函數(shù)體         int nTmp = x;              x = y;                 x = nTmp;是最典型的只用三行代碼就實現(xiàn)數(shù)據(jù)交換的代碼。沒問題,在執(zhí)行這三行代碼前和執(zhí)行后分別打印輸出就可以看得一清二楚,確實實現(xiàn)交換了。這說明上面的第四個條件也滿足,因為這三行代碼就是“從甲框拿x卡片放到地上,再把乙框的y卡片放入甲框,最好將地上的那張卡片(就是x卡片)揀起來放到乙框中去”。那么,到現(xiàn)在可以說明問題出在第三個條件不滿足。我們再繼續(xù)分析下去。

第三, swap函數(shù)聲明看。

從數(shù)據(jù)交換的程序代碼看,也就只剩這么一點東西還沒有去分析一下。我們的執(zhí)行過程其實又有幾個分步驟:

首先,輸入:int a= 100; int b= 200;這只是賦值操作,肯定沒有問題。

其次,執(zhí)行:步驟1,為調(diào)swap(int x,int y)函數(shù)做準(zhǔn)備,將a傳給xb傳給y

           步驟2,執(zhí)行swap(x, y),就是執(zhí)行函數(shù)體內(nèi)容。步驟2在上面已經(jīng)得到驗證,沒問題。

最后,執(zhí)行完畢在主函數(shù)里輸出ab100200,這是調(diào)C++標(biāo)準(zhǔn)輸出函數(shù)輸出的,提供什么數(shù)據(jù)就如實地輸出來。這也沒問題。

至此,問題已經(jīng)可以定位,就在“其次”里的“步驟1”!對這一步的執(zhí)行過程再繼續(xù)細(xì)分,就是:將甲框(輸入的a)的數(shù)字為100的卡片放到丙框(swap函數(shù)的參數(shù)x1, 將乙框(b)的數(shù)字為200的卡片放到丁框(swap函數(shù)的參數(shù)y)。程序接下來就是執(zhí)行“其次”里的“步驟2”,也即進(jìn)入函數(shù)體執(zhí)行,這時候在悄悄的把丙框和丁框的卡片相交換。可見原來交換的是丙框和丁框!甲框和乙框原來是什么樣還是什么樣。這當(dāng)然不會看到期望的輸出。

所以解決問題的根本是必須要“找對框”,只交換想要交換的“框”。對這個“找對框”的真正理解程度會直接反映出對指針的真正理解程度。 這樣,可能的解決方法比如:

基于指針swap方法(直接拿甲框和乙框的卡片并進(jìn)行交換,根本就沒有丙框和丁框):

void CPointerResearch::swap(int* x,int* y){

           
int nTmp = *x;

           
*= *y;

           
*= nTmp;

}

基于引用swap方法(不直接用丙框(而是引用到甲框)和丁框(而是引用到乙框)):

void CPointerResearch:: swap (int& x,int& y){

           
int nTmp = x;

           x 
= y;

           y 
= nTmp;

}

1本文舉的假想例子主要是為了說明問題,但例子不一定很貼切。“將甲框(輸入的a)的數(shù)字為100的卡片放到丙框(swap函數(shù)的參數(shù)x)”這句話,更貼切的說應(yīng)該是“甲框有跟線系在數(shù)字為100的卡片上,現(xiàn)在執(zhí)行“a傳給x”操作,就是說丙框要拉一根線出來也系到那張數(shù)字為100的卡片上”。

 

本篇內(nèi)容強(qiáng)調(diào)的就是一點,“什么是指針?指針的本質(zhì)是什么?”。理解指針的本質(zhì)是學(xué)習(xí)指針的關(guān)鍵所在。特別是初學(xué)指針者,如果能把這個swap函數(shù)真正搞明白,那么對指針的理解應(yīng)該說已經(jīng)有了一定的功底。如果很浮躁或很膚淺的去看待指針,是不會真正掌握指針的豐富內(nèi)涵的。用指針,要用,那就要用到“沒指針,就感覺不知道如何是好”這個地步。否則用指針也沒太大的意思,又容易出錯,不止怎么排除,自己可能興趣也不高。

posted on 2007-08-12 23:53 isabc 閱讀(382) 評論(0)  編輯 收藏 引用 所屬分類: C++基礎(chǔ)

廣告信息(免費廣告聯(lián)系)

中文版MSDN:
歡迎體驗

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲第一狼人社区| 国产一区二区三区在线免费观看| 亚洲国产免费| 一区二区激情视频| 国产精品推荐精品| 欧美在线一区二区三区| 蘑菇福利视频一区播放| 日韩亚洲欧美成人| 国产精品sss| 久久国产精品色婷婷| 亚洲国产精品电影在线观看| 亚洲视频精品| 国产亚洲精品一区二555| 免费成人美女女| 99精品国产热久久91蜜凸| 久久精品国产欧美激情| 亚洲精品少妇网址| 国产伦一区二区三区色一情| 美女网站在线免费欧美精品| 一区二区高清在线观看| 麻豆成人精品| 亚洲一区二区三区在线| 狠狠入ady亚洲精品| 欧美日产国产成人免费图片| 欧美一区午夜视频在线观看| 亚洲高清成人| 久久免费视频在线观看| 在线天堂一区av电影| 国内外成人免费激情在线视频| 欧美日韩国产区一| 久久久精品免费视频| 亚洲视频日本| 91久久夜色精品国产九色| 欧美制服第一页| 一区二区三区偷拍| 亚洲高清在线观看| 国产丝袜一区二区| 欧美视频一区| 欧美国产日韩亚洲一区| 久久精品国产一区二区三| 一区二区三区国产精品| 亚洲电影在线播放| 麻豆freexxxx性91精品| 性久久久久久久久久久久| 一区二区三区 在线观看视| 一区在线免费观看| 国产亚洲午夜| 国产精品一级久久久| 欧美日韩情趣电影| 欧美国产一区视频在线观看| 久久精品综合| 久久久久久久精| 久久精品五月婷婷| 欧美有码视频| 欧美在线亚洲一区| 亚洲欧美国产一区二区三区| 中文欧美日韩| 一区二区日韩伦理片| 99re热这里只有精品免费视频| 亚洲国产精品黑人久久久| 老**午夜毛片一区二区三区| 久久久久久亚洲精品中文字幕| 久久成人在线| 久久精品一本| 久久人人看视频| 久久午夜视频| 免费在线视频一区| 欧美成人国产| 亚洲福利视频网| 亚洲日本一区二区| 一本色道久久加勒比88综合| 夜夜嗨av色一区二区不卡| 一本色道久久综合亚洲精品小说| 亚洲免费观看| 亚洲午夜精品国产| 亚洲欧美日韩一区在线| 欧美一级网站| 久久久久久网| 欧美成人亚洲成人| 欧美日韩在线免费视频| 国产精品久久久久久久7电影| 国产精品素人视频| 国外成人在线| 91久久线看在观草草青青| 99热免费精品| 亚洲在线视频| 久久久久一区二区三区| 欧美国产精品v| 亚洲精品欧美日韩| 亚洲一区区二区| 久久久久久久久久久久久女国产乱| 久久蜜桃资源一区二区老牛 | 怡红院av一区二区三区| 亚洲国产精品va在看黑人| 日韩午夜在线观看视频| 亚洲免费在线观看| 久久天堂成人| 亚洲精品中文字| 欧美呦呦网站| 欧美阿v一级看视频| 国产精品成人一区二区| 好吊色欧美一区二区三区四区| 最近中文字幕日韩精品| 午夜久久福利| 欧美成人精品一区二区| 一本色道久久综合狠狠躁篇的优点 | 亚洲午夜国产一区99re久久 | 亚洲视频网在线直播| 久久久99爱| 欧美视频官网| 极品少妇一区二区| 亚洲在线一区二区| 欧美成人亚洲成人日韩成人| 亚洲深夜激情| 美女尤物久久精品| 国产精品毛片a∨一区二区三区| 黄色小说综合网站| 亚洲综合色自拍一区| 免费在线欧美视频| 亚洲永久免费观看| 欧美精品一区二区三区蜜臀| 国产一区二区0| 亚洲图片欧美午夜| 欧美激情视频给我| 性欧美精品高清| 欧美性大战久久久久久久| 亚洲黄色大片| 久久久久国产精品麻豆ai换脸| 亚洲精品永久免费| 免费欧美日韩国产三级电影| 国产日韩欧美在线看| 亚洲一区图片| 亚洲人成网站在线播| 久久久久99| 国产亚洲欧美另类中文 | 性娇小13――14欧美| 欧美日韩在线看| 亚洲激情在线观看视频免费| 久久久久九九视频| 亚洲在线一区二区| 欧美色精品在线视频| 亚洲九九爱视频| 欧美电影在线免费观看网站| 欧美在线高清| 国产网站欧美日韩免费精品在线观看| 中文欧美字幕免费| 亚洲免费大片| 欧美精品大片| 亚洲精品在线视频观看| 欧美成人三级在线| 久久嫩草精品久久久精品一| 国产综合一区二区| 久久久噜噜噜久久人人看| 欧美亚洲免费| 国产视频一区免费看| 久久国产精品亚洲va麻豆| 亚洲免费影院| 国产日韩亚洲欧美| 久久精品国产77777蜜臀| 新狼窝色av性久久久久久| 国产精品入口| 久久精品国产亚洲aⅴ| 篠田优中文在线播放第一区| 国产色产综合色产在线视频| 欧美中文字幕久久| 久久成人18免费网站| 激情伊人五月天久久综合| 噜噜噜噜噜久久久久久91| 老司机免费视频一区二区| 亚洲国产综合91精品麻豆| 亚洲日本在线观看| 欧美色欧美亚洲另类七区| 性久久久久久久久久久久| 欧美一激情一区二区三区| 好看的亚洲午夜视频在线| 欧美阿v一级看视频| 欧美激情一区二区三区不卡| 亚洲视频一区二区| 午夜精品亚洲| 亚洲电影观看| 亚洲毛片一区二区| 国产九区一区在线| 美女免费视频一区| 欧美精品一区二区三区蜜桃| 亚洲在线免费观看| 久久精彩视频| 99精品欧美一区| 亚洲欧美日韩国产综合在线 | 久久久99爱| 蜜乳av另类精品一区二区| 亚洲视频一区二区| 欧美在线观看一区二区| 亚洲日韩欧美视频| 亚洲一级免费视频| 永久免费精品影视网站| 亚洲免费成人| 激情成人av在线| 一区二区三区高清| 在线国产亚洲欧美| 一区二区欧美精品|