徹底了解指針數(shù)組,數(shù)組指針,以及函數(shù)指針,以及堆中的分配規(guī)則.doc_第1頁
徹底了解指針數(shù)組,數(shù)組指針,以及函數(shù)指針,以及堆中的分配規(guī)則.doc_第2頁
徹底了解指針數(shù)組,數(shù)組指針,以及函數(shù)指針,以及堆中的分配規(guī)則.doc_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

徹底了解指針數(shù)組,數(shù)組指針,以及函數(shù)指針,以及堆中的分配規(guī)則一:關(guān)于指針和堆的內(nèi)存分配先來介紹一下指針:指針一種類型,理論上來說它包含其他變量的地址,因此有的書上也叫它:地址變量。既然指針是一個類型,是類型就有大小,在達內(nèi)的服務(wù)器上或者普通的PC機上,都是個字節(jié)大小,里邊只是存儲了一個變量的地址而已。不管什么類型的指針,char*,int*,int(*),string*,float*,都是說明了本指針所指向的地址空間是什么類型而已,了解了這個基本上所有的問題都好象都變的合理了。在C+中,申請和釋放堆中分配的存貯空間,分別使用new和delete的兩個運算符來完成:指針類型指針變量名=new指針類型(初始化);delete指針名;例如:1、int*p=newint(0);它與下列代碼序列大體等價:2、inttmp=0,*p=&tmp;區(qū)別:p所指向的變量是由庫操作符new()分配的,位于內(nèi)存的堆區(qū)中,并且該對象未命名。下面是關(guān)于new操作的說明:部分引自C+面向?qū)ο箝_發(fā)1、new運算符返回的是一個指向所分配類型變量(對象)的指針。對所創(chuàng)建的變量或?qū)ο?,都是通過該指針來間接操作的,而動態(tài)創(chuàng)建的對象本身沒有名字。2、一般定義變量和對象時要用標識符命名,稱命名對象,而動態(tài)的稱無名對象(請注意與棧區(qū)中的臨時對象的區(qū)別,兩者完全不同:生命期不同,操作方法不同,臨時變量對程序員是透明的)。3、堆區(qū)是不會在分配時做自動初始化的(包括清零),所以必須用初始化式(initializer)來顯式初始化。new表達式的操作序列如下:從堆區(qū)分配對象,然后用括號中的值初始化該對象。下面是從堆中申請數(shù)組1、申請數(shù)組空間:指針變量名=new類型名下標表達式;注意:“下標表達式”不是常量表達式,即它的值不必在編譯時確定,可以在運行時確定。這就是堆的一個非常顯著的特點,有的時候程序員本身都不知道要申請能夠多少內(nèi)存的時候,堆就變的格外有用。2、釋放數(shù)組空間:delete指向該數(shù)組的指針變量名;注意:方括號非常重要的,如果delete語句中少了方括號,因編譯器認為該指針是指向數(shù)組第一個元素的,會產(chǎn)生回收不徹底的問題(只回收了第一個元素所占空間),我們通常叫它“內(nèi)存泄露”,加了方括號后就轉(zhuǎn)化為指向數(shù)組的指針,回收整個數(shù)組。delete的方括號中不需要填數(shù)組元素數(shù),系統(tǒng)自知。即使寫了,編譯器也忽略。上說過以前的delete方括號中是必須添加個數(shù)的,后來由于很容易出錯,所以后來的版本就改進了這個缺陷。二、以下具體介紹指針-指針-inta=10;int*p=&a;.-指針的指針-intb=20;int*p=&b;int*p2p=&p;特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點,本站所提供的攝影照片,插畫,設(shè)計作品,如需使用,請與原作者聯(lián)系.-簡單數(shù)組-intc10;/整數(shù)數(shù)組,含有10個整數(shù)元素也就是說每一個元素都是整數(shù)-指針數(shù)組-int*p10;/指針數(shù)組,含有10個指針元素也就是說每一個元素都是指針-數(shù)組指針-int(*p)10;/數(shù)組指針,這個指針能夠用來指向含有10個元素的整數(shù)數(shù)組-函數(shù)指針-.int(*p)();/指向函數(shù)的指針.這里聲明了一個指針p,該指針指向返回值是整型(即函數(shù)類型為整型)的函數(shù)!!-指針函數(shù)-.int*p(inta,floatb);/返回值為指針的函數(shù).該函數(shù)返回指向整型變量的指針!即該函數(shù)的類型為int*,p和上例不同,他是函數(shù)名!上例中是指針!函數(shù)存放在內(nèi)存的代碼區(qū)域內(nèi),他們同樣有地址,我們?nèi)绾文塬@得函數(shù)的地址呢?假如我們有一個inttest(inta)的函數(shù),那么,他的地址就是函數(shù)的名字,這一點如同數(shù)組相同,數(shù)組的名字就是數(shù)組的起始地址。定義一個指向函數(shù)的指針用如下的形式,以上面的test()為例:.int(*fp)(inta);/這里就定義了一個指向函數(shù)的指針.函數(shù)指針不能絕對不能指向不同類型,或是帶不同形參的函數(shù),在定義函數(shù)指針的時候我們很容易犯如下的錯誤。.int*fp(inta);/這里是錯誤的,因為按照結(jié)合性和優(yōu)先級來看就是先和()結(jié)合,然后變成了一個返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點尤其需要注意!.下面我們來看一個具體的例子:.#include#includeusingnamespacestd;inttest(inta);voidmain(intargc,char*argv)couttestendl;/顯示函數(shù)地址int(*fp)(inta);fp=test;/將函數(shù)test的地址賦給函數(shù)學(xué)指針fpcoutfp(5)|(*fp)(10)endl;/上面的輸出fp(5),這是標準c的寫法,(*fp)(10)這是兼容c語言的標準寫法,兩種同意,但注意區(qū)分,避免寫的程式產(chǎn)生移植性問題!cin.get();.inttest(inta)returna;函數(shù)指針同樣是能夠作為參數(shù)傳遞給函數(shù)的,下面我們看個例子,仔細閱讀您將會發(fā)現(xiàn)他的用處,稍加推理能夠很方便我們進行一些復(fù)雜的編程工作。根據(jù)專家觀察,這樣的理論和現(xiàn)象都是值得各位站長深思的,所以希望大家多做研究學(xué)習(xí),爭取總結(jié)出更多更好的經(jīng)驗!/-該例以上一個例子作為基礎(chǔ)稍加了修改-#include#includeusingnamespacestd;inttest(int);inttest2(int(*ra)(int),int);voidmain(intargc,char*argv)couttestendl;typedefint(*fp)(int);fpfpi;fpi=test;/fpi賦予test函數(shù)的內(nèi)存地址couttest2(fpi,1)endl;/這里調(diào)用test2函數(shù)的時候,這里把fpi所存儲的函數(shù)地址(test的函數(shù)地址)傳遞了給test2的第一個形參cin.get();inttest(inta)returna-1;inttest2(int(*ra)(int),intb)/這里定義了一個名字為ra的函數(shù)指針.intc=ra(10)b;/在調(diào)用之后,ra已指向fpi所指向的函數(shù)地址即test函數(shù)returnc;。利用函數(shù)指針,我們能夠構(gòu)成指針數(shù)組,更明確點的說法是構(gòu)成指向函數(shù)的指針數(shù)組,這么說可能就容易理解的多了。.#include#includeusingnamespacestd;voidt1()couttest1;voidt2()couttest2;voidt3()couttest3;voidmain(intargc,char*argv)void*a=t1,t2,t3;cout比較t1()的內(nèi)存地址和數(shù)組a0所存儲的地址是否一致t1|a0endl;couta0();/錯誤!指針數(shù)組是不能利用數(shù)組下標操作調(diào)用函數(shù)的typedefvoid(*fp)();/自定義一個函數(shù)指針類型fpb=t1,t2,t3;/利用自定義類型fp把b定義趁一個指向函數(shù)的指針數(shù)組b0();/現(xiàn)在利用指向函數(shù)的指針數(shù)組進行下標操作就能夠進行函數(shù)的間接調(diào)用了;cin.get();.上面的這一小段中的錯誤行,為什么不能這么調(diào)用呢?前一篇教程我們已說的很清楚了,但是在這里我們還是復(fù)習(xí)一下概念,指針數(shù)組元素所保存的只是個內(nèi)存地址,既然只是個內(nèi)存地址就不可能進行a0()這樣地址帶括號的操作,而函數(shù)指針不同他是個例外,函數(shù)指針只所以這么叫他就是因為他是指向函數(shù)指向內(nèi)存的代碼區(qū)的指針,他被系統(tǒng)授予允許和()括號操作的權(quán)利,進行間接的函數(shù)調(diào)用,既然函數(shù)指針允許這么操作,那么被定義成函數(shù)指針的數(shù)組就一定是能夠相同的操作的。仔細看

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論