引用參數

我們常常看到函數的形參帶有引址符,其實那不是引址符,而是引用參數。引用參數是個什麼鬼東東?

引用參數是由調用部位傳入實參的地址(寫在留言板上)的形參
形參表中以符號“&”開始的參數即爲引用參數。如果一個形參是引用參數,調用部位將把實參的地址傳遞給子程序子程序可以改變傳遞給引用參數的任何實參,因爲子程序操作的是真正的變量,而不是它的副本。
把參數聲明成引用,實際上改變了缺省的按值傳遞參數的傳遞機制,在按值傳遞時,函數操縱的是實參的本地拷貝。


以上來內容自百度百科


最關鍵的點是:參數是引用時,函數接收的是實參的左值而不是值的拷貝。這意味着函數知道實參在內存中的位置,因而能夠改變它的值或取它的地址。


另外再提一下指針做參數:

(函數原型裏)參數用指針,允許數值經參數傳入函數,運算結果可以經參數帶回調用處。
(函數原型裏)參數不用指針,允許數值經參數傳入函數,但運算結果 不能 經參數 帶回 調用處。

測試如下:

#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,樓主寫過一些樹的題目,在創建樹的時候常常要將根節點的指針前加上引用符,否則之後的程序無法找到已創建的樹。經樓主分析認爲,若不加引用符,函數操縱的只是一個副本,而真正的根節點的指針任是初始狀態,故而之後的程序無法找到已創建的樹。(這一點其實是第二點活生生的例子,只是樓主曾在這一點上糾結了許久,故單獨拿出來強調一下大哭


我們可以聲明任意內置數據類型的引用參數

例如,如果程序員想修改指針本身,而不是指針引用的對象,那麼他可以聲明一個參數,該參數是一個指針的引用,例如:下面是交 換兩個指針的函數
void ptrswap( int *&v1, int *&v2 ) {

int *tmp = v2; v2 = v1; v1 = tmp;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章