妹子與漢子——引用與指針的區別(1)

首先,我們分別得說明,指針和引用分別是什麼:


指針:它是對一個類型的對象而言的.假如有一個T類型的對象a,那麼*T類型就是一個指針類型,它代表了T類型的對象所佔據內存的地址。


引用:它是一個T類型對象的別名。因此不能脫離實際對象而存在。




一:指針和引用的區別:


1.引用不能爲NULL,而指針可以爲NULL

當引用進行聲明的時候,必須進行初始化,否則,就會出現如下圖的情況。


當然,你要是說有個人,寫如下的代碼:



那我只能說,這就是GG思密達,這個引用根本木有意義,可能會輸出任何東西,但我在Dev裏面嘗試了一把,直接就崩潰了。


2.引用必須有初始化值,而指針不必有。

這其實和上一條是一致的。引用既然只是個別名,那麼必然就得有其所依附的類型的對象,否則只有別名,沒有主名,就不知道引用到哪裏去了。



當然,指針雖說不一定要初始化,但是我們在聲明指針的時候,最好能把它設置成NULL,這樣我們在檢驗的時候,才能更好的判斷其有效性。


3.引用不必做有效性檢查,但是指針是必須的。

這個性質其實又繼承於區別2。有效性檢查通常就是看,這個值到底是不是合法的?在函數裏是不是可用的?由於引用不能是NULL,那就是說,其必然依附於一個類型T的對象,則在傳入參數的時候,不需要進行有效性檢驗。

但是指針就很明顯不一樣了。上一條說過,如果暫時用不上,指針最好初始化爲NULL。那麼,在將指針傳進函數的時候,指針很有可能什麼都不指向。(當然,這比指針指向了一個亂七八糟的東西,變成野指針,還是要好點的,畢竟NULL指針還是容易判斷的)。因此,我們必須在使用這個指針之前,先測試一下,看看指針是否爲NULL,才能繼續用下去。


4.引用至死不渝,指針到處亂頂

引用就像童養媳,從出生開始,我們就規定它,必須是某個類型的對象的別名,還不能改變。管它是啥對象,黑的白的,高的矮的,說是它了,那就是它了。好像是個指腹爲婚的女孩,而且對方還必須得比你先出生。等到出生了,引用就得嫁給那個對象,一輩子就是那個對象的別名,想改也改不了。這很像古代中國女子所受到的束縛。當然我們必須得說,通過引用,我們是能夠改變其對象本身的,就好像即便是古代的老婆,枕頭風的威力還是不能小覷。

指針就像是個漢子,它可以不指向任何對象,而即便指向了某個對象,也可以換,不同時間內可以指向不同的對象。所以,我們可以看到,漢子四十沒對象,只要條件還不錯,就叫鑽石王老五,妹子要四十了還沒嫁,那家裏人可急的。同時,指針對其所指向的對象可以改變。但是我們後續會提到,世界上還有 const這麼個玩意,於是指針就不能隨便亂搞了。


5.其他

        1)對於引用,++操作直接作用在對象上,而對指針++,大家懂得,那指針就是下一個對象的地址了(話說,指針必須有指向類型,如果是void型的指針,++操作就有問題了,它不知道步長到底是多少。)

     2)由於沒有空引用,一旦初始化,引用不會變成另外一個對象的引用。而指針可以變來變去,即便是const指針,假如有很多個指針指向同一個對象,假如free掉一個指針,那麼其他指針就變成野指針了,這個問題值得我們注意。

  3sizeofref,得到的結果是引用對象的大小,而sizeof(ptr),得到的則是指針的大小,32位機上就是4個字節了。(但是,我用 double,char都可以得到這個結論,但用string卻一直都是4,還得再查一下)


二:const與引用和指針


對於指針來說,const可以修飾它所指向的對象,也可以修飾指針本身。

const int* ptr 指的是ptr指向的int型對象不能被修改。

int * const ptr 指的是ptr這個指針不能指向別的對象了(也就是說,不能想指誰就指誰了。一旦限制了這個,它的作用被削弱,跟引用一樣,但是還有可能產生野指針,還不如用ref呢)


const int &ref 這個說明ref所引用的對象不能被改變。我個人覺得,如果不能改變所指向的對象的值,用引用更加安全,至少不會出現野指針。速度也是一樣的。


話說,對於指針來說,若const出現在*號的左邊,說明是指向的對象不能改變,若const出現在*號的右邊,說明指針本身不能被改變了,可以記住。


三:引用與指針的實現

引用和指針在底層的實現是一樣的,其實引用雖然是別名,但是還是會佔用內存空間。


參考文獻:

http://blog.csdn.net/listening_music/article/details/6921608

meyer:《more effective C++》




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章