以上來內容自百度百科。
最關鍵的點是:參數是引用時,函數接收的是實參的左值而不是值的拷貝。這意味着函數知道實參在內存中的位置,因而能夠改變它的值或取它的地址。
另外再提一下指針做參數:
(函數原型裏)參數用指針,允許數值經參數傳入函數,運算結果可以經參數帶回調用處。
(函數原型裏)參數不用指針,允許數值經參數傳入函數,但運算結果 不能 經參數 帶回 調用處。
測試如下:
#include <stdio.h>
using namespace std;
void ff(int *x,int *y){
*x=2;*y=1;
}
int main(){
int x=1,y=2;
ff(&x,&y);
printf("%d %d\n",x,y);
return 0;
}
輸出結果爲:2 1
#include <stdio.h>
using namespace std;
void ff(int *x,int *y){
int *z;
z=x;x=y;y=z;
}
int main(){
int x=1,y=2;
ff(&x,&y);
printf("%d %d\n",x,y);
return 0;
}
輸出結果爲:1 2
引用形參函數一開始接收的值爲地址,測試如下:
#include <stdio.h>
using namespace std;
void ff(int &x,int &y){
printf("%d %d\n",x,y);
}
int main(){
int x,y;
ff(x,y);
return 0;
}
#include <stdio.h>
using namespace std;
void ff(int &x,int &y){
x=1;y=2;
}
int main(){
int x=3,y=4;
ff(x,y);
printf("%d %d\n",x,y);
return 0;
}
輸出結果爲:1 2
而我們在函數中可以改變x,y的值並將其傳遞迴原函數,相當於直接操縱x,y.
那麼,引用參數有什麼作用呢?
1,引用參數可以有額外的返回結果,即被引用的參數相當於是額外的返回結果了。
2,需要改變實參的值,例如拓展歐幾里得算法。
3,向函數傳遞大型的類對象。關於這一點樓主還不懂,先mark。
4,樓主寫過一些樹的題目,在創建樹的時候常常要將根節點的指針前加上引用符,否則之後的程序無法找到已創建的樹。經樓主分析認爲,若不加引用符,函數操縱的只是一個副本,而真正的根節點的指針任是初始狀態,故而之後的程序無法找到已創建的樹。(這一點其實是第二點活生生的例子,只是樓主曾在這一點上糾結了許久,故單獨拿出來強調一下)
我們可以聲明任意內置數據類型的引用參數
int *tmp = v2; v2 = v1; v1 = tmp;
}