徹底了解指針數(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),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

2、指針類型指針變量名 = new 指針類型 (初始化); delete 指針名; 例如:1、 int *p = new int(0); 它與下列代碼序列大體等價(jià): 2、int tmp = 0, *p = &tmp; 區(qū)別:p所指向的變量是由庫操作符new()分配的,位于內(nèi)存的堆區(qū)中,并且該對(duì)象未命名。 下面是關(guān)于new 操作的說明:部分引自c+面向?qū)ο箝_發(fā)1、new運(yùn)算符返回的是一個(gè)指向所分配類型變量(對(duì)象)的指針。對(duì)所創(chuàng)建的變量或?qū)ο?,都是通過該指針來間接操作的,而動(dòng)態(tài)創(chuàng)建的對(duì)象本身沒有名字。 2、一般定義變量和對(duì)象時(shí)要用標(biāo)識(shí)符命名,稱命名對(duì)象,而動(dòng)態(tài)的稱無名對(duì)象(請(qǐng)注意與棧區(qū)中的臨時(shí)對(duì)象的區(qū)

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

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

5、供的攝影照片,插畫,設(shè)計(jì)作品,如需使用,請(qǐng)與原作者聯(lián)系. -簡(jiǎn)單數(shù)組-int c10;/整數(shù)數(shù)組,含有10個(gè)整數(shù)元素也就是說每一個(gè)元素都是整數(shù)-指針數(shù)組-int *p10;/指針數(shù)組,含有10個(gè)指針元素也就是說每一個(gè)元素都是指針-數(shù)組指針-int (*p)10;/數(shù)組指針,這個(gè)指針能夠用來指向含有10個(gè)元素的整數(shù)數(shù)組-函數(shù)指針- . int (*p)( ); / 指向函數(shù)的指針.這里聲明了一個(gè)指針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ù)的地址呢? 假如我們有一個(gè)int test(int a)的函數(shù),那么,他的地址就是函數(shù)的名字,這一點(diǎn)如同數(shù)組相同,數(shù)組的名字就是數(shù)組的起始地址。定義一個(gè)指向函數(shù)的指針用如下的形式,以上面的test()為例: . int (*fp)(int a);/這里就定義了一個(gè)指向函數(shù)的指針 . 函數(shù)指針不能絕對(duì)不能指向不同類型,或是帶不同形參的函數(shù),在定義函數(shù)指針的時(shí)候我們很容易犯如下的錯(cuò)誤。 . int *fp(int a);/這里是錯(cuò)誤的,因?yàn)榘凑战Y(jié)合性和優(yōu)先級(jí)來看就是先和()結(jié)合,然后變成

7、了一個(gè)返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點(diǎn)尤其需要注意! . 下面我們來看一個(gè)具體的例子: . #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ù)的,下面我們看個(gè)例子,仔細(xì)閱讀您將會(huì)發(fā)現(xiàn)他的用處,稍加推理能夠很方便我們進(jìn)行一些復(fù)雜的編程工作。 根據(jù)專家觀察,這樣的理論和現(xiàn)象都是值得各位站長(zhǎng)深思的,所以希望大家多做研究學(xué)習(xí),爭(zhēng)取總結(jié)出更多更好的經(jīng)驗(yàn)! /-該例以上一個(gè)例子作為基礎(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ù)的時(shí)候,這里把fpi所存儲(chǔ)的函數(shù)地址(test的函數(shù)地址)傳遞了給test2的第一個(gè)形參 cin.get(); int test(int a) return a-1; int test2(int (*ra)(int),int b)/這里定義了一個(gè)名字為ra的函數(shù)指針 . int c=ra(10) b;/在調(diào)用之后,ra已指向fpi所指向的函數(shù)地址即test函數(shù) return c; 。

10、 利用函數(shù)指針,我們能夠構(gòu)成指針數(shù)組,更明確點(diǎn)的說法是構(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所存儲(chǔ)的地址是否一致t1|a0endl; couta0();/錯(cuò)誤!指針數(shù)組是不能利用數(shù)組下標(biāo)操作調(diào)用函數(shù)的typedef void (*fp)();/

11、自定義一個(gè)函數(shù)指針類型 fp b=t1,t2,t3; /利用自定義類型fp把b定義趁一個(gè)指向函數(shù)的指針數(shù)組 b0();/現(xiàn)在利用指向函數(shù)的指針數(shù)組進(jìn)行下標(biāo)操作就能夠進(jìn)行函數(shù)的間接調(diào)用了; cin.get(); . 上面的這一小段中的錯(cuò)誤行,為什么不能這么調(diào)用呢? 前一篇教程我們已說的很清楚了,但是在這里我們還是復(fù)習(xí)一下概念,指針數(shù)組元素所保存的只是個(gè)內(nèi)存地址,既然只是個(gè)內(nèi)存地址就不可能進(jìn)行a0()這樣地址帶括號(hào)的操作,而函數(shù)指針不同他是個(gè)例外,函數(shù)指針只所以這么叫他就是因?yàn)樗侵赶蚝瘮?shù)指向內(nèi)存的代碼區(qū)的指針,他被系統(tǒng)授予允許和()括號(hào)操作的權(quán)利,進(jìn)行間接的函數(shù)調(diào)用,既然函數(shù)指針允許這么操作,那么被定義成函數(shù)指針的數(shù)組就一定是能夠相同的操作的

溫馨提示

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

評(píng)論

0/150

提交評(píng)論