徹底搞定指針和引用的區(qū)別_第1頁
徹底搞定指針和引用的區(qū)別_第2頁
徹底搞定指針和引用的區(qū)別_第3頁
徹底搞定指針和引用的區(qū)別_第4頁
徹底搞定指針和引用的區(qū)別_第5頁
免費預(yù)覽已結(jié)束,剩余15頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、概括指針和引用,在C+勺軟件開發(fā)中非常常見,如果能恰當(dāng)?shù)氖褂盟鼈兡軌驑O大的提高整個軟件的效率,但是很多的C+存習(xí)者對它們的各種使用情況并不是都了解,這就導(dǎo)致了實際的軟件開發(fā)中經(jīng)常會內(nèi)存泄漏,異常拋出,程序崩潰等問題。對于C和C+勺初學(xué)者,那更是被它們搞的迷迷糊糊。本篇作為深入C+系列的第一節(jié),我們就帶領(lǐng)大家把指針和引用這個基本功練好。二指針指針,指針的定義是什么呢?好像要想給個直接的定義還是很難的哦,所以我們這里用它的語法結(jié)合圖來認識它。inti=10;int*p=NULL;p=&i;intj=*p;int*pP=NULL;pP=&p;在上面的幾條語句中,&用來定義引用

2、變量或?qū)ψ兞咳∑涞刂罚?用來定義指針或得到指針?biāo)赶虻淖兞?,其中p為定義的指針變量,它指向int變量i,而pP為二級指針變量,它指向指針變量p。相應(yīng)的示意圖如下:pPPiR的地址-Ti的地址T110C+隹又tC的擴展,我們首先來看指針在C中的使用,下面的經(jīng)典實例來自林銳的高質(zhì)量編程,記住函數(shù)的默認參數(shù)傳遞方式為按值傳遞,即實參被傳入函數(shù)內(nèi)時進行了拷貝,函數(shù)內(nèi)其實是對拷貝對象的操作,還有當(dāng)函數(shù)使用return返回變量時,其實返回的是原對象的一個拷貝,此時的實參和原對象有可能是一般變量也有可能是指針變量。HUCode#pragmaonce#include<cstring>#includ

3、e<cstdio>#include<cstdlib/numvoidGetMemory1(char*p,int(p=(char*malloc(num;voidTest1(void(char*str=NULL;GetMemory1(str,100;strcpy(str,"helloworldprintf(str;/numvoidGetMemory2(char*p,int(*p=(char*malloc(num;voidTest2(voidchar*str=NULL;GetMemory2(&str,100;strcpy(str,"helloworld&q

4、uot;printf(str;free(str;/char*GetMemory3(void(charp="helloworldreturnp;voidTest3(void(char*str=NULL;str=GetMemory3(;printf(str;/char*GetMemory4(void(char*p="helloworld"returnp;voidTest4(char*str=NULL;str=GetMemory4(;printf(str;/char*GetMemory5(void(char*p=(char*malloc(100;strcpy(p,&qu

5、ot;helloworld"returnp;voidTest5(char*str=NULL;str=GetMemory5(;printf(str;free(str;/voidTest6(void100;(char*str=(char*malloc(strcpy(str,"hello"free(str;if(str!=NULL(strcpy(str,"world"printf(str;/voidTestPointerAndReference(/請問運行Testi函數(shù)會有什么樣的結(jié)果?/答:程序崩潰。同時有內(nèi)存泄漏。/因為在GetMemoryl函數(shù)

6、的調(diào)用過程中,其實是對實參指針p做了拷貝,拷貝為局部變量,/在函數(shù)內(nèi)的操作是對局部變量的操作,局部變量與實參是兩個不同的變量,相互不影響。/所以,當(dāng)GetMemoryl調(diào)用結(jié)束時,Testi函數(shù)中的str一直都是NULL/strcpy(str,"helloworld"將使程序崩潰。/Test1(;/請問運行Test2函數(shù)會有什么樣的結(jié)果?/答:(1能夠輸出helloworld;(2但是調(diào)用結(jié)束要對內(nèi)存釋放,否則內(nèi)存泄漏;/Test2(;/請問運行Test3函數(shù)會有什么樣的結(jié)果?/答:可能是亂碼。/因為GetMemoryM回的是指向“棧內(nèi)存”的指針,/該指針的地址不是NULL

7、但其原現(xiàn)的內(nèi)容已經(jīng)被清除,新內(nèi)容不可知。/Test3(;/請問運行Test4函數(shù)會有什么樣的結(jié)果?/答:(1能夠輸出helloworld;(2此時的str指向了常量區(qū),不需要程序員釋放,程序結(jié)束自動釋放。/Test4(;/請問運行Test5函數(shù)會有什么樣的結(jié)果?/答:(1能夠輸出helloworld;(2但是調(diào)用結(jié)束要對內(nèi)存釋放,否則內(nèi)存泄漏;/Test5(;/請問運行Test6函數(shù)會有什么樣的結(jié)果?/答:篡改動態(tài)內(nèi)存區(qū)的內(nèi)容,后果難以預(yù)料,非常危險。/因為free(str;之后,str成為野指針,/if(str!=NULL®句不起作用。/Test6(;三C+指針與引用引用,其實是變

8、量的別名,與變量是同一個東東。例如inti=10;int&a=i;int&b=i;這樣a,b為i的引用,即a,b為i的別名,還有int*pi=newint(10;int*&pa=pi;int*&pb=pi;止匕時pa,pb為pi的別名。在C+”引入了引用概念后,我們不僅可以定義引用變量,相應(yīng)的函數(shù)的傳遞方式也增加了按引用傳遞,當(dāng)參數(shù)以引用方式傳遞時,函數(shù)調(diào)用時不對實參進行拷貝,傳入函數(shù)內(nèi)的變量與實參是同一個變量。下面的實例演示了指針和引用在C+勺使用。UUCode#pragmaspanOnce#include<iostream>spanclassPo

9、intpublic:Point(intx,intyy;_x=x;_yvoidSetX(int_x=x;)voidSetY(inty(_y=y;)voidPrintPoint(std:cout('<<_x<<','<<"ThePointis<<_y<<"<<'<<std:endl;)voidPrintPointAdress(std:endl;std:cout<<"ThePoint'sadressis:"<<th

10、is<<)private:int_x;int_y;br;br/span默認按值傳遞,當(dāng)傳入時對對像進行了拷貝,函數(shù)內(nèi)只是對所拷貝值的修改,所以實參沒被修改。voidChangeValue(Pointpt,intx,inty(pt.SetX(x;pt.SetY(y;/按引用傳遞,函數(shù)內(nèi)外同一值,所以修改了實參。voidChangeValueByReference(Point&pt,嚴禁外傳x,inty(pt.SetX(x;pt.SetY(y;通過傳遞指針,雖然實參指針傳入時也產(chǎn)生了拷貝,但是在函數(shù)內(nèi)通過指針任然修改了指針?biāo)傅闹?。voidChangeValueByPointe

11、r(Point*審x,int受控狀態(tài):ypt->SetX(x;ptSetY(y;2010-02-30發(fā)布2010Pointpt(10,*連云港職業(yè)技術(shù)學(xué)院100,畢業(yè)設(shè)計(*集團形象推廣傳播、費用及合同管理規(guī)定.3200,200;pt.PrintPoint(;ChangeValueByPointer(4.*集團分公司傳播項目動態(tài)價格指導(dǎo)3005.300設(shè)計(*&/按引用傳遞,所以指針可以被返回。voidChangePointerByReference(Point*intx,int(pPt本規(guī)定適用于newPoint(x,y;集團指導(dǎo)教師:對二級指針拷貝,但是二級指針指向的一級指針

12、被返回void6.1.13運*pPt,int其x,int6y(*pPt=new錄Point(x,y;4.2.1 所有費用在實施前必須以費用計劃表形式voidTestChangePointer(10004.2.2 Point*pPt=NULL;ChangePointerByReference(pPt,1.1.1JavaScriptpPt4.3.1所有項目的費用結(jié)算,必須在活動項目結(jié)束之后20->1.1.321.2研究網(wǎng)站導(dǎo)航技術(shù)的目的和意義7企劃部總部發(fā)生的廣告費用,營銷中心經(jīng)理負責(zé)審查跟進付款;分公司發(fā)生的廣告費用,由分公司經(jīng)理負責(zé)審查支付1.3課題來源4.3.4按合同付款要求(見5.2

13、支付,網(wǎng)站導(dǎo)航概述所有簽訂的合同,必須按合同有關(guān)條款,建立統(tǒng)一格式的p=6.4.2new6.4.3企劃部根據(jù)總部與分公司的管理臺帳情況int(6.4.3在*集團2.3/int*p2=newint(10;合同序號,從1結(jié)語年份的后兩位數(shù)參考文獻各單位字母編號&20002000附錄37、廣告合同7.1 合同分類(以下各類合同樣本附后).7.1.1 ->三級標(biāo)題小四號宋體居左->7.1.3deletepPt;pPt=NULL;)voidTestPointerAndReference2(合同簽定的前提條件:企劃部總部廣告合同簽定,須填報TestChangePointer(;)7.2

14、.2正文首行縮進兩個漢字符,宋體小四號字,7.2.3四函數(shù)參數(shù)傳遞方式,函數(shù)中return語句和拷貝構(gòu)造函數(shù)的關(guān)系通過上面的2個實例,如果還有人對函數(shù)的參數(shù)傳遞方式和return有疑問的啊,可以對下面的代碼親自debug。分公司所有合同由分公司分類編號歸檔、備查,并將復(fù)印件上交企劃部存檔。HUCode設(shè)計"once8信息管理功能”<iostream8.1 延期上報合同臺帳造成負面影響的,根據(jù)實際情況扣罰責(zé)任人20-100元;CLASSCOPYANDASSIGNPUBLIC8.3 簽定合同后未于INTI8.4 總部合同在公司領(lǐng)導(dǎo)未審批完畢而先執(zhí)行的,輕者扣罰責(zé)任人500元,重者按

15、實施金額的5%寸責(zé)任人進行扣罰;WEB8.59.地區(qū)導(dǎo)航(GeographicNavigation)i;8.6 簽定合同時內(nèi)容不全者,輕者按每缺一項扣罰20元處理,重者對責(zé)任人予以合同金額COPYANDASSIGN8.72.2.2網(wǎng)站導(dǎo)航的表現(xiàn)形式附:表1'集團拷貝構(gòu)造!"*this;)本規(guī)定如與前期部門相關(guān)規(guī)定有沖突,以本規(guī)定為準(zhǔn)。:INTX;);COPYANDASSIGNRETURNCOPYANDASSIGN(CopyAndAssignAsParameter(CopyAndAssignca名稱std:endl;CA.X;)表COPYANDASSIGN&表右鍵導(dǎo)航菜

16、單20;/構(gòu)造returntemp;)void快捷鍵導(dǎo)航(constCopyAndAssign&ca下拉導(dǎo)航菜單7*表8"賦值操作CopyAndAssign符&ReturnCopyAndAssignByReference("<<STD二ENDL;X=CA.X;CopyAndAssigntemp(20;根據(jù)GB3469構(gòu)造RETURNreturn.文獻題名temp;)voidCopyAndAssignAsParameterByReference(CopyAndAssign&矩形截面氣升式環(huán)流反應(yīng)器中非牛頓流體的氣含率與傳質(zhì)系數(shù)的研究ca化工

17、學(xué)報)voidTestCopyAndAssign(CopyAndAssignc1(10;/構(gòu)造2序號作者.書名M.版本(第一版不標(biāo)注).出版地:出版者,出版年.示例.拷貝構(gòu)造1973.CopyAndAssignAsParameterByReference(c1;ReturnCopyAndAssignByReference(;序號作者國藉.書名M.譯者.出版地:出版者,出版年總結(jié)1指針也是變量,它存儲其他變量的地址。例如int*p=newint(10;p是指針變量,p實際是存儲了一個int變量的地址。2)引用其實是一個別名,跟原對象是同一個東東。例如std二stringstr="hello"std:string&strR=str;此時strR跟str序號str的一個小名3)函數(shù)默認的傳參方式為按值傳遞,即當(dāng)實參傳入是其實是做了拷貝,函數(shù)內(nèi)其實是對所拷貝對象的操作。例如voidIncrease(intxx+;調(diào)用時inti=10;Increase(i;Increase函數(shù)內(nèi)部其實是對i的一個拷貝(我們假設(shè)為ii)進行+。所以在函數(shù)調(diào)用結(jié)束后原來的i的值仍然保持不變。4)函數(shù)的傳參方式可以顯示的指定按引用來傳遞,按引用傳遞時,函數(shù)內(nèi)即對實參的操作,沒有拷貝操作,所以函數(shù)內(nèi)對實參的修改,當(dāng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論