值傳遞:
形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。
指標傳遞:
形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作。
引用傳遞:
形參相當於是實參的「別名」,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。
**測試:
#include
using
namespace
std;
//值傳遞
void change1( int n )
//引用傳遞
void change2( int &n )
//指標傳遞
void change3(int *n)
int main()
★不同點:
●指標是乙個實體,而引用僅是個別名;
●引用只能在定義時被初始化一次,之後不可變;指標可變;引用「從一而終」,指標可以「見異思遷」;
●引用沒有const,指標有const,const的指標不可變;(具體指沒有int& const a這種形式,而const int& a是有的, 前者指引用本身即別名不可以改變,這是當然的,所以不需要這種形式,後者指引用所指的值不可以改變)
●引用不能為空,指標可以為空;
●「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身的大小;
●指標和引用的自增(++)運算意義不一樣;
●用是型別安全的,而指標不是 (引用比指標多了型別檢查)
關於引用:
引用引入了物件的乙個同義詞。定義引用的表示方法與定義指標相似,只是用&代替了*。
引用必須在定義時馬上被初始化,因為它必須是某個東西的同義詞。你不能先定義乙個引用後才
初始化它。例如下面語句是非法的:
point &pt3;
pt3=pt1;
那麼既然引用只是某個東西的同義詞,它有什麼用途呢?
下面討論引用的兩個主要用途:作為函式引數以及從函式中返回左值。
1、傳遞可變引數
傳統的c中,函式在呼叫時引數是通過值來傳遞的,這就是說函式的引數不具備返回值的能力。
所以在傳統的c中,如果需要函式的引數具有返回值的能力,往往是通過指標來實現的。比如,實現
兩整數變數值交換的c程式如下:
void swapint(int *a,int *b)
使用引用機制後,以上程式的c++版本為:
void swapint(int &a,int &b)
呼叫該函式的c++方法為:swapint(x,y); c++自動把x,y的位址作為引數傳遞給swapint函式。
2、給函式傳遞大型物件
當大型物件被傳遞給函式時,使用引用引數可使引數傳遞效率得到提高,因為引用並不產生物件的
副本,也就是引數傳遞時,物件無須複製。下面的例子定義了乙個有限整數集合的類:
const maxcard=100;
class set
//建構函式
friend set operator * (set ,set ) ; //過載運算符號*,用於計算集合的交集 用物件作為傳值引數
// friend set operator * (set & ,set & ) 過載運算符號*,用於計算集合的交集 用物件的引用作為傳值引數
… }
先考慮集合交集的實現
set operator *( set set1,set set2)
{ set res;
for(int i=0;i
值傳遞,引用傳遞,指標傳遞
最近一直被c 的值傳遞,引用傳遞,指標傳遞這些概念所困擾,一直沒有乙個能說清他們之間的關係通過乙個簡單的例項,或者說淺顯的說法,找了一些相關資料,和自已的個人感受,簡單介紹一下,希望高人指正 c 中傳遞引數的方式有三種 傳引數的值 稱為值傳遞,簡稱傳值 傳引數的位址 稱為位址傳遞,簡稱為傳址 和引用...
指標傳遞 引用傳遞 值傳遞
用指標變數可以表示各種資料結構,能很方便地使用陣列,字串和鍊錶。並不是直接運算元據,而且它可以直接和記憶體打交道,使用稍有不慎,就會造成程式崩潰。使用指標的好處 1 在資料傳輸時,如果資料塊較大,這時就可以使用指標傳遞位址而不是實際資料。提高傳輸速度,又節省大量記憶體。2 在資料結構中,鍊錶 樹 圖...
c 值傳遞 指標傳遞 引用傳遞
值傳遞 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的 實參 形參 引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。指標傳遞 形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作 引...