Const指針和引用的混合使用_第1頁
Const指針和引用的混合使用_第2頁
Const指針和引用的混合使用_第3頁
Const指針和引用的混合使用_第4頁
Const指針和引用的混合使用_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 C+的那點事,const,指針和引用的混合使用對于學習Java或者C#的程序員來說,學習C+的時候,大概看到那些使用const int*& a之類的當參數(shù)時都會蒙了吧··老實說,盡管當時我覺得自己C+書都看差不多了,學得也可以,但實際上,看到const,"*","&"的混合使用時,我也蒙了。這篇文章就我自己的一些看法來談談不同的混合方式都有什么作用。· 沒有const的時候。沒有const時,也就是*和&的混合使用。這里又分&是當取地址運算符或者是引用運算符兩種情況,怎么區(qū)分&am

2、p;是取地址還是引用呢?很簡單,如果&之前沒有類型就是用作引用,否則就是當取地址符。例如:int& 這是引用,int* p = &a 這是取地址。1.&是取地址時: 這種情況在譚浩強的C+程序設計里面有說明 P168如果有int* p = &a;那么 &*p 是什么含義呢?由于"&"和"*"的優(yōu)先級都為3,但按自右至左方向結合。所有&*p = &(*p) = &a = p,也就是a的地址下面程序的輸出結果是一樣的。 那么 *&

3、amp;a 的含義呢?同樣可以分析,*&a = *(&a) = *p = a,也就是說,*&a與a等價。同樣的,下面程序的輸出結果是一樣的。2.&是引用時: 這種情況大多出現(xiàn)在函數(shù)形參里,當初也是這種情況把我搞混了。例如如果一個函數(shù)的形參是 int*& p ,那么它代表的是什么意思,又有什么作用呢?可以這樣理解:int*& = (int*)&,也就是一個整型指針的引用。這又有怎么作用呢?這里用一個例子來說明,引自譚浩強的C+程序設計里的P173上面這段代碼試圖通過函數(shù)更改兩個指針的指向來達到交換的功

4、能,即不改變a和b的值,但改變pointer_1和pointer_2的指向來達到使pointer_1指向較大值,而pointer_2指向較小值。但通過輸出的結果看,這并不成功。為什么呢?我們都知道,函數(shù)調用時會虛實結合,即把實參拷貝給形參(引用除外),這里的形參是指針也是一樣的。也就說調用時,系統(tǒng)在堆棧上創(chuàng)建了兩個整型指針變量(它們確實占用了另一段內存),所以更改它們不會影響到實參。具體過程如下圖所示: 那么怎么在函數(shù)內改變實參指針的指向呢?答案就是用*&,也就是指針的引用。首先要強調一點的是,有些初學C+的人會搞不清楚引用的實現(xiàn)機制,以為引用跟指針用法一樣(我當初就這樣想的

5、),但其實它們區(qū)別很大。下面說說我對引用的一些看法,或許對你有幫助。書上一般會說:引用是為一個變量取一個別名。我覺得這樣反而不好理解,如果這樣說呢:引用是與變量使用同一塊內存。如果將變量看成是一小塊內存,那么使用不同內存的變量自然不能當成是同一個變量,盡管它們的值可以一樣,但更改一處并不會改變另一處。但引用就是使用相同內存的,所以引用可以看成是與變量是同一個變量??聪旅娴睦樱簭慕Y果中可以看到,a和b的地址是一樣的,而且在函數(shù)f1的形參與實參的地址也是一樣的,而不是用引用的f2的地址就不同。而我們也可以用指針指向引用變量,也可以用引用當作整型參數(shù)來傳遞。所以說引用跟原變量完全就是同一個變量???/p>

6、以用下面一段代碼來實現(xiàn)在函數(shù)內改變實參指針的指向:運行上面的代碼,可以看到,調用Fun1后,p的指向依然是a,但調用Fun2后,p的指向就改到b了。也驗證了上面那個說法。至于另一種情況,也就 int&* 的情況,這個情況大家上機一試就知道了,是不同通過編譯的。原因很簡單,沒有這樣的定義。· 有const的情況在搞懂了沒有const的情況后,有const的情況無非就是加了一層常量限定了。1.const與*的結合首先是3個常見的const和指針的結合:const int* p,int* const p,const int* const p。這3種在大部分的C+

7、書籍上都有介紹了。分別是:const int* p - 指向常量的指針int* const p - 常指針const int* const p - 指向常量的常指針這3種也是一般用在函數(shù)參數(shù)里比較多。這里稍微介紹一下:const int* p 不能改變指針指向的值,可以改變其指向。即*p = 1是非法的,而p = &b是合法的。int* const p 能改變指針所指向的值,不可以改變其指向。即*p = 1是合法的,而p = &b是非法的。const int* const p 不能改變指針所指向的值,也不可以改變其指向。即*p = 1和p = &b都是非法的。怎么記憶著

8、三種奇怪的寫法呢?這里是我的記憶方法:使用左結合:const int* p => (const int)* p 也就是一個指針所指向的是常量int* const p => (int*) const) p 也就是一個指針本身是常量而const int* const 就是兩者的結合。2.const與&的結合下面看看const 和 & 的結合使用。最常見的就要數(shù): const int& a 了,這個最常使用在類的拷貝構造函數(shù)里,這就是默認的寫法。這個理解起來很簡單,就是使用引用,同時又是常量。跟const int a的區(qū)別就在于:在函數(shù)虛實結合

9、時,有&的使用引用方式,而沒有的就是值傳遞。我剛開始以為也會有 int& const a 的形式,后來試了一下,確實有,但是沒用??聪旅娴拇a:這段代碼可以通過編譯,最后結果是實參a的值改為3了,也就是說int& const a 是等價于int& a的。本來我猜想, const int& const a 是等價于const int& a的。后來才發(fā)現(xiàn)這種寫法是編譯不過的。呵呵··3.const、*、&的結合最后就是3種形式的結合,const 和 * 和 &的結合。1.&#

10、160;const int*& p 的使用這個應該算是比較常見到一種了吧,第一次看的時候相信很多人都會蒙了吧,呵呵上面提到了int*&是指針的引用,不要以為const int*&是(const) (int*&)是這兩組的組合意思,根據(jù)左結合,const int*&是(const int*)&的意思,前面也提到const int*是指向常量的指針的意思,那么const int*&就是指向常量的指針的引用的意思??聪旅娴拇a:綜合地說,const int*&的功能如下:不能改變指針所指向的值,可以改變指針的指向,改變形參指針

11、的指向會改變實參的指向。2.int*& const p 的意思經過測試,int*& const是等價于int*&的,也就說后面的const不起作用。3.同理,const int*& const 是不能通過編譯的。各位看客是不是以為到此為止呢,呵呵,還有一些可能你想都沒想到的用法呢!4.int* const &p 的使用通過前面那么多的分析,大家也試試猜猜這個用法的意思。采用左結合int* const &p => (int* const)& p 也就是一個常指針的引用。同樣用一小段代碼來測試一下:老實說,這是個只有無聊的人才會想到的用法(狂暈),我們分析一下:我們在指針型的形參加引用是為了可以改變實參的指向,但我們又定義了形參是一個不能改變指向的常指針。所以:int* const& p 是等價于 int* const的。· 總結:可能會有人說這種用法int const *,這個···翻翻書就知道了,這個是等價于int* const的,也就是const 和 * 的位置可以換的。上面說了很多組合,但實際有用的也就那么幾種。這里總結一下:1.int*

溫馨提示

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

評論

0/150

提交評論