close
C++在呼叫函式時的參數傳遞方式主要有三種:傳值(pass by value)、傳址(pass by address)、傳參考(pass by reference)。

參數傳遞時的傳值就是只傳送變數的值給函式,這時就如同將變數的值指定給另一個變數,傳遞者與接受者兩個變數彼此各佔有一個記憶體,互不相干,例如:
代碼:
int main() {
int x = 10;
....
cout increment(x)
;
cout x
;

return 0;
}

int increment(int n) {
n = n + 1;
return n;
}


在這個程式片段中,x將值傳遞給increment()函式的參數n,n雖然作了遞增運算,但是對x的儲存值並無影響,x最後仍是顯示10。

參數傳遞時的傳址方式,就是將變數的記憶體告訴被呼叫的函式,函式的參數列使用指標來儲存這個記憶體位址,由於我們知道了變數的記憶體位址,我們可以直接對這塊記憶體作變動的動作,例如:
代碼:
int main() {
int x = 10;
....
cout increment(&x)
;
cout x
;

return 0;
}

int increment(int *n) {
*n = *n + 1;
return *n;
}


在這個程式中,n是個指標,在呼叫increment()函式時,我們使用取址運算子將x變數的記憶體位址取出,並傳遞給指標n,而在函式中,我們使用取值運算子*取出這塊記憶體位址的值,並作遞增動作之後再指定回該記憶體位址,所以程式最後的x變數會顯示值11。

由 以上可知,我們使用傳址時,通常是在於我們希望傳遞的參數,在函式中若有變動時,呼叫者也可以保留這份變動的結果,這可以解決一個問題,在C++中我們在 呼叫函式後只能傳回(return)一個值,若在呼叫函式時,我們希望能取得兩個以上的運算結果,就可以使用傳址呼叫。

C++中還有傳參考,其實它與傳址呼叫是一體的兩面,就我的觀點來說,它可以避免傳址呼叫上的可能語法錯誤,例如:
代碼:
int main() {
int x = 10;
....
cout increment(x)
;
cout x
;

return 0;
}

int increment(int &n) {
n = n + 1;
return n;
}


在 上面的程式片段中,我們在increment()的參數列中使用參考宣告int&,當我們呼叫increment()函式時,我們不用使 用&運算子取得x變數的記憶體位址,n會自動參考至x變數的位址,由於x變數與n變數的記憶體位址是相同的,所以在increment()中的遞 增動作,同樣會影響x變數,所以程式最後x會顯示為11。

使用傳址或是傳參考好呢?見人見智,如果您已經很熟悉C,那麼您可能會比較熟悉傳址呼叫,如果您初學C++,您可能會覺得傳參考比較不會弄錯,使用時注意到您到底是使用傳址或者是傳參考就對了。
arrow
arrow
    全站熱搜

    天才R 發表在 痞客邦 留言(0) 人氣()