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

下載本文檔

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

文檔簡介

1、徹底了解指針數(shù)組,數(shù)組指針,以及函數(shù)指針,以及堆中的分配規(guī)則一 :關(guān)于指針和堆的內(nèi)存分配 先來介紹一下指針: 指針一種類型,理論上來說它包含其他變量的地址,因此有的書上也叫它:地址變量。既然指針是一個類型,是類型就有大小,在達(dá)內(nèi)的服務(wù)器上或者普通的pc機上,都是個字節(jié)大小,里邊只是存儲了一個變量的地址而已。不管什么類型的指針,char * ,int * ,int (*) ,string * ,float * ,都是說明了本指針?biāo)赶虻牡刂房臻g是什么類型而已,了解了這個基本上所有的問題都好象都變的合理了。 在c+中,申請和釋放堆中分配的存貯空間,分別使用new和delete的兩個運算符來完成:

2、指針類型指針變量名 = new 指針類型 (初始化); delete 指針名; 例如:1、 int *p = new int(0); 它與下列代碼序列大體等價: 2、int tmp = 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、一般定義變量和對象時要用標(biāo)識符命名,稱命名對象,而動態(tài)的稱無名對象(請注意與棧區(qū)中的臨時對象的區(qū)

3、別,兩者完全不同:生命期不同,操作方法不同,臨時變量對程序員是透明的)。 3、堆區(qū)是不會在分配時做自動初始化的(包括清零),所以必須用初始化式(initializer)來顯式初始化。new表達(dá)式的操作序列如下:從堆區(qū)分配對象,然后用括號中的值初始化該對象。 下面是從堆中申請數(shù)組 1、申請數(shù)組空間: 指針變量名=new 類型名下標(biāo)表達(dá)式; 注意:“下標(biāo)表達(dá)式”不是常量表達(dá)式,即它的值不必在編譯時確定,可以在運行時確定。這就是堆的一個非常顯著的特點,有的時候程序員本身都不知道要申請能夠多少內(nèi)存的時候,堆就變的格外有用。 2、釋放數(shù)組空間: delete 指向該數(shù)組的指針變量名; 注意:方括號非常重

4、要的,如果delete語句中少了方括號,因編譯器認(rèn)為該指針是指向數(shù)組第一個元素的,會產(chǎn)生回收不徹底的問題(只回收了第一個元素所占空間),我們通常叫它“內(nèi)存泄露”,加了方括號后就轉(zhuǎn)化為指向數(shù)組的指針,回收整個數(shù)組。delete 的方括號中不需要填數(shù)組元素數(shù),系統(tǒng)自知。即使寫了,編譯器也忽略。上說過以前的delete 方括號中是必須添加個數(shù)的,后來由于很容易出錯,所以后來的版本就改進了這個缺陷。 二、以下具體介紹指針-指針-int a=10;int *p=&a; . -指針的指針-int b=20;int *p=&b;int *p2p=&p; 特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點,本站所提

5、供的攝影照片,插畫,設(shè)計作品,如需使用,請與原作者聯(lián)系. -簡單數(shù)組-int c10;/整數(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(int a,float b); /返回值為指針的函數(shù).該函數(shù)返回指向整型變量的指針! 即該函數(shù)的類型為int

6、 *, p和上例不同,他是函數(shù)名!上例中是指針! 函數(shù)存放在內(nèi)存的代碼區(qū)域內(nèi),他們同樣有地址,我們?nèi)绾文塬@得函數(shù)的地址呢? 假如我們有一個int test(int a)的函數(shù),那么,他的地址就是函數(shù)的名字,這一點如同數(shù)組相同,數(shù)組的名字就是數(shù)組的起始地址。定義一個指向函數(shù)的指針用如下的形式,以上面的test()為例: . int (*fp)(int a);/這里就定義了一個指向函數(shù)的指針 . 函數(shù)指針不能絕對不能指向不同類型,或是帶不同形參的函數(shù),在定義函數(shù)指針的時候我們很容易犯如下的錯誤。 . int *fp(int a);/這里是錯誤的,因為按照結(jié)合性和優(yōu)先級來看就是先和()結(jié)合,然后變成

7、了一個返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點尤其需要注意! . 下面我們來看一個具體的例子: . #include #include using namespace std; int test(int a); void main(int argc,char* argv) couttestendl;/顯示函數(shù)地址 int (*fp)(int a); fp=test;/將函數(shù)test的地址賦給函數(shù)學(xué)指針fp coutfp(5)|(*fp)(10)endl; /上面的輸出fp(5),這是標(biāo)準(zhǔn)c 的寫法,(*fp)(10)這是兼容c語言的標(biāo)準(zhǔn)寫法,兩種同意,但注意區(qū)分,避免寫的程式產(chǎn)生移植性問題

8、! cin.get(); . int test(int a) return a; 函數(shù)指針同樣是能夠作為參數(shù)傳遞給函數(shù)的,下面我們看個例子,仔細(xì)閱讀您將會發(fā)現(xiàn)他的用處,稍加推理能夠很方便我們進行一些復(fù)雜的編程工作。 根據(jù)專家觀察,這樣的理論和現(xiàn)象都是值得各位站長深思的,所以希望大家多做研究學(xué)習(xí),爭取總結(jié)出更多更好的經(jīng)驗! /-該例以上一個例子作為基礎(chǔ)稍加了修改- #include #include using namespace std; int test(int); int test2(int (*ra)(int ),int); void main(int argc,char* argv)

9、couttestendl; typedef int (*fp)(int); fp fpi; fpi=test;/fpi賦予test 函數(shù)的內(nèi)存地址 couttest2(fpi,1)endl;/這里調(diào)用test2函數(shù)的時候,這里把fpi所存儲的函數(shù)地址(test的函數(shù)地址)傳遞了給test2的第一個形參 cin.get(); int test(int a) return a-1; int test2(int (*ra)(int),int b)/這里定義了一個名字為ra的函數(shù)指針 . int c=ra(10) b;/在調(diào)用之后,ra已指向fpi所指向的函數(shù)地址即test函數(shù) return c; 。

10、 利用函數(shù)指針,我們能夠構(gòu)成指針數(shù)組,更明確點的說法是構(gòu)成指向函數(shù)的指針數(shù)組,這么說可能就容易理解的多了。 . #include #include using namespace std; void t1()couttest1; void t2()couttest2; void t3()couttest3; void main(int argc,char* argv) void* a=t1,t2,t3; cout比較t1()的內(nèi)存地址和數(shù)組a0所存儲的地址是否一致t1|a0endl; couta0();/錯誤!指針數(shù)組是不能利用數(shù)組下標(biāo)操作調(diào)用函數(shù)的typedef void (*fp)();/

11、自定義一個函數(shù)指針類型 fp b=t1,t2,t3; /利用自定義類型fp把b定義趁一個指向函數(shù)的指針數(shù)組 b0();/現(xiàn)在利用指向函數(shù)的指針數(shù)組進行下標(biāo)操作就能夠進行函數(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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論