我們現在先假設目前有兩個變數,分別是A=5,B=10
又有一個swap(C,D)函數(即變數交換),裡面有著參數C與D
故一開始變數的情況如下:
變數 | 值 | 記憶體位址 |
---|---|---|
A | 5 | 0×04 |
B | 10 | 0×08 |
C | … | … |
D | … | … |
以下便以BEFORE代表A,B剛傳入swap(C,D)時的狀態,以AFTER代表swap(C,D)執行完後的狀態
傳值呼叫(call by value):
函數宣告方式 | 函數用法 |
---|---|
swap(int C,int D) | swap(A,B) |
變數 | 值(Before) | 記憶體位址(Before) | 值(After) | 記憶體位址(After) |
---|---|---|---|---|
A | 5 | 0×04 | 5 | 0×04 |
B | 10 | 0×08 | 10 | 0×08 |
C | 5 | 0×16 | 10 | 0×16 |
D | 10 | 0×32 | 5 | 0×32 |
根據上表所示,很明顯地傳值呼叫只是將A,B兩個變數的值複製給C,D這兩個參數,爾後C,D如何的變化,都不會影響A,B。
傳址呼叫(call by value of pointer 或 call by address):
函數宣告方式 | 函數用法 |
---|---|
swap(int *C,int *D) | swap(&A,&B) |
變數 | 值(BEFORE) | 記憶體位址(BEFORE) | 值(AFTER) | 記憶體位址(AFTER) |
---|---|---|---|---|
A | 5 | 0×04 | 10 | 0×04 |
B | 10 | 0×08 | 5 | 0×08 |
C | 0×04 | 0×16 | 0×04 | 0×16 |
D | 0×08 | 0×32 | 0×08 | 0×32 |
傳址呼叫是將A,B的記憶體位址傳給C,D這兩個參數當作值,就如同C,D是A,B在swap(C,D)裡面的反向傳出通道,其異動結果將會改變A,B的值,而不改變所有變數的記憶體指派情況。
傳參考呼叫(call by reference):
函數宣告方式 | 函數用法 |
---|---|
swap(int &C,int &D) | swap(A,B) |
變數 | 值(BEFORE) | 記憶體位址(BEFORE) | 值(AFTER) | 記憶體位址(AFTER) |
---|---|---|---|---|
A | 5 | 0×04 | 10 | 0×08 |
B | 10 | 0×08 | 5 | 0×04 |
C | 5 | 0×04 | 10 | 0×08 |
D | 10 | 0×08 | 5 | 0×04 |
傳參考呼叫是在C++以後才有的技術,以C,D代理A,B的一切資料,包含值與記憶體位址。所以C,D的異動將會完全連動A,B的異動,且不需要額外分配新的記憶體給C,D。
參考來源:mlab Blog
廣告