*是去引用運算符,或稱之為間接引用運算符
首先看一下 普通形參
int add1(int a) { return a+1; } void main() { int num = 10; int num2; num2 = add1(num); }
在這種情況下,num的值不會因為調用了add1而改變,即實參的值不變。
再來看一下 指針參數
void add2(int *p) { *p +=1; } void main() { int num1; add2(&num1); }
使用指針做為函數的形參,指針的值(即&num1)不會因為*p+=1而受到影響,但是&num1這個地址里存放的值(num)增加了1。所以要想修改實參的值,可以使用指針形參的方法。
但是還有一種更安全更自然的方法-引用形參
引用形參的格式如下面函數所示:
void swap(int &a,int &b) { int temp=a; a=b; b=temp; }
如果在主函數中調用swap()函數:
void main() { int x = 10, y = 20; swap(x,y); }
那么實參x和y的值會被調換過來,也就是說如上所寫的引用形參會修改實參的值。
如果不想修改實參的值,應該加上const,如下面例子所示。
void swap(const int &a,const int &b)
引用形參直接關聯到其所綁定的對象,而非這些對象的副本。 所以這種方法可以修改實參的值,而且更加直觀。
注:以下內容轉自http://www.cppblog.com/liujiajia/archive/2008/07/14/56131.html
使用引用形參的優點:
在向函數傳遞大對象時,需要使用引用形參。雖然賦值實參對於內置數據類型的對象或者規模較小的類型來說沒有什么問題,但是對於大部分的類型或者大型數組,它的效率就比較低了。另外,某些類型是無法復制的。使用引用形參,函數可以直接訪問實參對象,而無須復制它。
示例:
bool isShorter(const string &str1,const string &str2)//const
{
return str1.size()<str2.size();
}
由於string對象可能非常的長,我們希望避免復制操作。
如果使用引用形參的唯一目的是避免復制形參,則應將形參定義為const引用。
使用引用形參應該注意的:
int incr(int &val)
{
return ++val;
}
void main(void)
{
short v1=1;
const int v2=10;
int v3=20;
incr(v1); //錯誤,v1不是int
incr(v2); //錯誤,v2是const
incr(v3); //正確
incr(10); //錯誤
}
所以,調用非const類型的引用形參,實參必須不是const類型的,而且實參的類型和形參的類型應當一致。
一個引用形參被翻譯成一個指針變量,相應的實參被翻譯成這個實參的地址。當在函數中被使用時,指針形參被自動的去引用,從而產生對應實參的別名。(from數據結構與算法分析)
在以上例子中,引用形參 val被翻譯成一個指針變量,調用incr(v3)時,v3這個實參被翻譯成v3的地址。
關於指針和指針的引用可以看: http://www.cnblogs.com/no7dw/archive/2011/03/19/1988540.html