呼叫函式的時候, 我們需要傳遞給函式引數。 有兩種方式, 一種是pass by value, 另一種方式是pass by reference。
二者是有區別的。
所謂的pass by value(傳值), 就是將變數拷貝乙份, 效果是如果在函式內部對這個變數修改了, 那麼這種修改並不會反映到函式外部。
呼叫函式執行完畢後, 函式的stack frame 移除, 那麼這個變數的拷貝也會消失。似乎有點讓人困惑,想想, 為什麼在之前寫的<> 這篇文章中, 使用全域性變數(numcalls)統計函式(foo())被呼叫的次數卻可以儲存下對全域性變數的修改。 答案是顯而易見的, 因為在那篇文章中, 並沒有將numcalls作為引數, 自然就沒有所謂的pass by value 時對變數拷貝的發生了。
anyway, 言歸正傳, 現在以乙個例子說明:
#include using namespace std;
//pass by value
void increment(int a)
int main()
執行結果為:
將上述程式拆解為如下幾步:
接下來介紹pass by reference。
其實傳遞的是引數變數的位址。 不難看出, 那麼我們對原始變數的任何的修改都會儲存下來, 不會隨著函式呼叫的結束而消失。 因為這裡並沒有發生拷貝。 速度也比較快。
如下例, 我們只是將定義函式是引數a 改變為&a, 其他同上面的函式完全一致, 但是效果完全不同:
#include using namespace std;
//pass by reference
void increment(int &a)
int main()
執行結果如下:
將上述程式執行的步驟拆解, 如下:
值傳遞和引用傳遞 函式引數傳遞的兩種方式
在定義函式時函式括號中的變數名成為形式引數,簡稱形參或虛擬引數 在主調函式中呼叫乙個函式時,該函式括號中的引數名稱為實際引數,簡稱實參,實參可以是常量 變數或表示式。1 c語言中實參和形參之間的額資料傳遞是單向的 值傳遞 單向傳遞,只能由實參傳給形參,反之不能。2 被呼叫函式的形參只有函式被呼叫時才...
shell傳遞引數的兩種方式(詳解版)
我們可以在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為 n。n 代表乙個數字,1 為執行指令碼的第乙個引數,2 為執行指令碼的第二個引數,以此類推 例項以下例項我們向指令碼傳遞三個引數,並分別輸出,其中 0 為執行的檔名 bin bash echo shell 傳遞引數例項...
陣列的兩種傳遞方式
陣列傳遞 將陣列作為引數傳遞給函式,分值傳遞和位址傳遞。其中,值傳遞的效率較低,不建議使用。兩種傳遞方式都會改變main函式中陣列的值,如下 中a 3 的結果都為6。注意區分陣列的值傳遞和函式值傳遞的區別。陣列的兩種傳遞方式 includeusing namespace std 值傳遞 void f...