http://blog.csdn.net/zenny_chen/archive/2008/06/04/2512056.aspx C/C++中取地址符&的語義
http://zhishi.sohu.com/question/35975900.html C++中的&是什麼意思及常見用法
http://blog.csdn.net/zjfei/archive/2010/03/30/5432122.aspx C,C#,C++中&&和||,&和|的聯絡和區別
http://www.dnbcw.com/biancheng/c/frsc79380.html 小議C#中的“&”按位與運算子
演算法中形參中的&是指C語言裡面的地址還是C++中的引用?
c語言中形參表示指標用*,實參中的地址才用&,形參中用&的是c++裡面的引用,下面分別為兩段代碼:
//函數venus(int &a)中的&是引用
#include "stdio.h"
void venus(int &a){
printf("x : %d",a);
}
int main()
{
int a = 0;
int &r = a;
venus(r);
return 0;
}
//函數venus(int *a)中的*是指標
#include "stdio.h"
void venus(int *a){
printf("x : %d",a);
}
int main()
{
int a = 0;
int &r = a;
venus(&r);
return 0;
}
引用的一個重要作用就是作為函數的參數。以前的C語言中函數參數傳遞是值傳遞,如果有大塊資料作為參數傳遞的時候,採用的方案往往是指標,因為這樣可以避免將整塊資料全部壓棧,可以提高程式的效率。但是現在(C++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用。
【例2】:
void swap(int &p1, int &p2) //此處函數的形參p1, p2都是引用
{ int p; p=p1; p1=p2; p2=p; }
為在程式中調用該函數,則相應的主調函數的調用點處,直接以變數作為實參進行調用即可,而不需要實參變數有任何的特殊要求。如:對應上面定義的swap函數,相應的主調函數可寫為:
main( )
{
int a,b;
cin> > a> > b; //輸入a,b兩變數的值
swap(a,b); //直接以變數a和b作為實參調用swap函數
cout < <a < < ' ' < <b; //輸出結果
}
上述程式運行時,如果輸入資料10 20並斷行符號後,則輸出結果為20 10。
由【例2】可看出:
(1)傳遞引用給函數與傳遞指標的效果是一樣的。這時,被調函數的形參就成為原來主調函數中的實參變數或對象的一個別名來使用,所以在被調函數中對形參變數的操作就是對其相應的目標對象(在主調函數中)的操作。
(2)使用引用傳遞函數的參數,在記憶體中並沒有產生實參的副本,它是直接對實參操作;而使用一般變數傳遞函數的參數,當發生函數調用時,需要給形參分配儲存單元,形參變數是實參變數的副本;如果傳遞的是對象,還將調用拷貝建構函式。因此,當參數傳遞的資料較大時,用引用比用一般變數傳遞參數的效率和所佔空間都好。
(3)使用指標作為函數的參數雖然也能達到與使用引用的效果,但是,在被調函數中同樣要給形參分配儲存單元,且需要重複使用 "*指標變數名 "的形式進行運算,這很容易產生錯誤且程式的閱讀性較差;另一方面,在主調函數的調用點處,必須用變數的地址作為實參。而引用更容易使用,更清晰。
如果既要利用引用提高程式的效率,又要保護傳遞給函數的資料不在函數中被改變,就應使用常引用。