傳值、傳址、傳參考呼叫

 

我們現在先假設目前有兩個變數,分別是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

 

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s