久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

c++中"指針"終結(jié)理解

 昵稱10504424 2013-02-19
分類: c++專區(qū) 內(nèi)存相關(guān) 用心之作 59人閱讀 評論(0) 收藏 舉報

目錄(?)[+]

  1. 二取地址符號
  2. 三參數(shù)的傳遞方式
  3. 四指針與對象
我們可以對指針這樣定義:

通過指針中存放的首地址,應(yīng)用程序順利地找到某個變量,。就好像我最近認識了一位朋友,,他叫我有空去他家坐坐,然后,,他留下了地址,。某個周末我正閑著,忽然想起這位朋友,,于是,,我就根據(jù)他留的地址去找他,結(jié)果,當我來到傻B街230號出租房時,,里面走出一個我不認識的人,,于是,我問他我這位朋友去哪了,,陌生人說,,我剛租了這房子,你找的可能是前一位租戶吧,。

所以,,指針所指向的地址,有可能是變量B,,也有可能是變量F,,或者變量S,指針是房東,,可以把房子租給B,,C,或F,,它可以動態(tài)為變量分配內(nèi)存,,也可以把變量銷毀(delete),交不起房租就滾蛋(析構(gòu)函數(shù)),。

從上面的故事中,,我們看到指針的兩個用途:索引內(nèi)存和分配內(nèi)存

看看下面這個例子,。

你猜猜,,它運行后會出現(xiàn)什么?

我們看到了,,pint里面存的就是整型100的首地址,,因為它是int*,是指向int的指針,,所以指針知道,,找到首地址后,我只關(guān)注從首地址開始,,連續(xù)的4個字節(jié),,后面的我不管了,因為我只知道int有四個字節(jié),。上面的例子,,我們看到pint的值就是0x10f1968,這就是整型100在內(nèi)存中的首地址,,所以,,100所擁有的內(nèi)存塊可能是:

0x10f1968 , 0x10f1969, 0x10f196A, 0x10f196b

總之是連續(xù)的內(nèi)存塊來保存這4個字節(jié),。

new int(100),表示指針pint在首地址為0x10f1968的內(nèi)存區(qū)域創(chuàng)建了一個4個字節(jié)的區(qū)域,,里面保存的值就是整型100,,所以,pint取得的就是100的首地址,,而加上*號就不同了,,看看上面的例子,*pint的值就是100了,。這樣一來,,我們又得到一個技巧:

利用指針標識符 * 放在指針變量前即可獲得指針所指地址中存儲的實際值,。


我都大家一個很簡單的技巧,。看看下面兩行代碼,。

int *p = new int(200);

int p = 200;

因為 * 放在類型后或放在變量名前面都是可以的,,即int* pint和int *pint是一個道理。這樣一來,,我們不妨把int *pint 看作int (*pint),,將整個*pint看作一個整體,這樣看上去是不是和下面的聲明很像,?

int a = 30;

所以,,int* p = new int(30)中,*p返回的值就是int的本值30,,而p則只是返回30的首地址,。

再看看下面的代碼:

現(xiàn)在你可以猜猜它的運行結(jié)果是什么。


從上面的代碼我們又看到了指針的第三個功能:創(chuàng)建數(shù)組,。

上例中,,我創(chuàng)建了有三個元素的數(shù)組。在使用完成后,,要使用delete來刪除已分配的內(nèi)存,,所以,我們的第一個例子中,,其實不完善,,我們沒有做內(nèi)存清理。

int* pint = new int(100);

/****/

delete pint;

為什么指針可以創(chuàng)建數(shù)組,?前面我提到過,,指針是指向首地址的,那么你想想,,我們的數(shù)組如果在堆上分配了內(nèi)存,,它們是不是也按一定次序存放在一塊連續(xù)的內(nèi)存地址中,,整個數(shù)組同樣構(gòu)成了一段內(nèi)存塊。

二,、取地址符號&

很多書和教程都把這個符號叫引用,,但我不喜歡翻譯為引用,因為引用不好理解,,如果叫取地址符,,那我估計你就會明白了,它就是返回一個變量的首地址,。

看看例子:

我們不能直接對指針變量賦值,,要把變量的地址傳給指針,就要用取地址符&,。上面的代碼中我們聲明了int類型的變量a,,值為50,通過&符號把變量a的地址存到p指針中,,這樣,,p指向的就是變量a的首地址了,故:a的值的50,,而p的值就應(yīng)該是a的地址,。

那么,這樣做有啥好處呢,?我們把上面的例子再擴展一下,,變成這樣:

先預(yù)覽一下結(jié)果。



不知道大家在這個例子中發(fā)現(xiàn)了什么,?

我們定義了變量a,,值為50,然后指針p指向了a的首地址,,但注意,,后面我只是改變了p所指向的那塊內(nèi)存中的值,我并沒有修改a的值,,但是,,你看看最后a的值也變?yōu)榱?50,想一想,,這是為什么,?

三、參數(shù)的傳遞方式

很多書,,包括一些計算機二級的考試內(nèi)容,,那些傻S磚家只是想出一大堆與指針相關(guān)的莫名其妙的考題,,但很讓人找不到指針在實際應(yīng)用到底能干什么,我估計那些磚家自己也不知識吧,。所以,,我們的考試最大的失敗,就是讓學(xué)生不知識學(xué)了有什么用,。

上面介紹了指針可以存首地址,,可以分配內(nèi)存,可以創(chuàng)建數(shù)組,,還說了取地址符&,,那么,這些東西有什么用呢,?你肯定會問,,我直接聲明一個變量也是要占用內(nèi)存的,那我為什么要吃飽了沒事干還要用指針來存放首地址呢,?

好,,我先不回答,我們再說說函數(shù)的參數(shù)傳遞,。看看下面這樣的例子,。


我們希望,,在調(diào)用函數(shù)fn后,變量a的值會加上100,,現(xiàn)在我們運行一下,,看看結(jié)果:

我們可能會很失望,為什么會這樣,?我明明是把20傳進了fn函數(shù)的,,為什么a的值還是不變呢?不用急,,我們再把代碼改一下:

運行結(jié)果如下:


看到了嗎,?變量a和fn函數(shù)的參數(shù)x的地址是不一樣的,這意味著什么呢,?這說明,,變量a的值雖然傳給了參數(shù)x,但實際上是聲明了一個新變量x,,而x的值為20罷了,,最后加上100,x的中的值是120,,但a的值沒有變,,因為在函數(shù)內(nèi)被+100的根本不是變量a,,而是變量x(參數(shù))。

這樣,,就解釋了為什么么函數(shù)調(diào)用后a的值仍然不變的原因,。

那么,如何讓函數(shù)調(diào)用后對變量a作修改,,讓它變成120呢,?這里有兩個方法:

(1)指針法。把參數(shù)改為指針類型,。

這里要注意,,把變量傳給指針類型的參數(shù),要使用取地址符&,。

那么,,這次運行正確嗎?


好了,,終于看到想要的結(jié)果了,。

(2)引用法,就是把參數(shù)改為&傳遞的,。

可以看到,,這樣的運行結(jié)果也是正確的。


四,、指針與對象

不管是類還是結(jié)構(gòu)(其實結(jié)構(gòu)是一種特殊的類),,它們在創(chuàng)建時還是要創(chuàng)建內(nèi)存的,但是,,創(chuàng)建類的對象也有兩種方式,,直接聲明和用指針來分配新實例。


我們來看看這個例子,首先定義了一個類Test,,在類的構(gòu)造函數(shù)中輸出對象被創(chuàng)建的個息,在發(fā)生析構(gòu)時輸出對象被銷毀,。

接著,, 我們分別在兩個函數(shù)中創(chuàng)建Test類的對象,因為對象是在函數(shù)內(nèi)部定義的,,根據(jù)其生命周期原理,,在函數(shù)返回時,對象會釋放,,在內(nèi)存中的數(shù)據(jù)會被銷毀,。理論上是這樣的,那么,,程序?qū)嶋H運行后會如何呢,?

這時候我們發(fā)現(xiàn)一個有趣的現(xiàn)象,在第一個函數(shù)直接以變量形式創(chuàng)建的對象在函數(shù)執(zhí)行完后被銷毀,,因為析構(gòu)函數(shù)被調(diào)用,;可是,,我們看到第二個函數(shù)中并沒有發(fā)生這樣的事,用指針創(chuàng)建的對象,,在函數(shù)完成時居然沒有調(diào)用析構(gòu)函數(shù),。

直接創(chuàng)建對象,變量直接與類實例關(guān)聯(lián),,這樣一來,,當變量的生命周期結(jié)束時,自然會被處理掉,,而用指針創(chuàng)建的實例,,指針變量本身并不存儲該實例的數(shù)據(jù),它僅僅是存了對象實例的首地址罷了,,指針并沒有與實例直接有聯(lián)系,,所以,在第二個函數(shù)執(zhí)行完后,,被銷毀的是Test*,,而不是Test的對象,僅僅是保存首地址的指針被釋放了而已,,而Test對象依然存在于內(nèi)存中,,因此,在第二個函數(shù)完成后,,Test的析構(gòu)函數(shù)不會調(diào)用,,因為它還沒死呢。

那么,,如何讓第二個函數(shù)在返回時也銷毀對象實例呢,?還記得嗎,我前文中提過,。對,,用delete.。


現(xiàn)在看看,,是不是在兩個函數(shù)返回時,,都能夠銷毀對象。

現(xiàn)在你明白了吧,?

由此,,可以得出一個結(jié)論:指針只負責(zé)為對象分配和清理內(nèi)存,并不與內(nèi)存中的對象實例有直接關(guān)系,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多