1. 程式人生 > >關於按值傳遞和按地址傳遞

關於按值傳遞和按地址傳遞

今天遇到一個問題:呼叫函式的時候,我想要被改變的那個物件(這個物件在呼叫函式這邊叫形參,我想改變它)一直沒被改變。究其原因,我自動化形成函式(過程中的函式)的時候,系統預設按值傳遞引數。雖然我想要被改變的那個物件在過程中的函式(此時為形參)裡被改變了,但是呼叫此函式的部分,也就是(傳入的實參)並沒有被改變。

程式碼如下:

呼叫部分:

FillContract(drw_Contract, rstc_Contract(int_ContractCnt - 1))
)


我想改變rstc_Contract(int_ContractCnt - 1) 這是一個結構體, 
drw_Contract同樣是一個結構體,對於他是否改變我不在意。

過程中的函式:
 Private Sub FillContract(ByVal drw_Contract As DataRow, ByRef ContractDataRow As RFQ.ContractDataRow)
     
            ContractDataRow.chrcontract = drw_Contract("chrcontract")
        
    End Sub


上面的函式是正確的,自動化的函式都是按值傳遞(預設傳遞方式),也就

 Private Sub FillContract(drw_Contract As DataRow, ContractDataRow As RFQ.ContractDataRow)
     
            ContractDataRow.chrcontract = drw_Contract("chrcontract")
        
    End Sub


這種rstc_Contract(int_ContractCnt - 1)在呼叫部分裡不變值為NOTHING
網路參考資料如下:
1.定義:
ByVal 與 ByRef(預設值)
這兩個是子過程的引數傳遞時,指定引數按什麼傳遞的
ByVal(按值傳遞)
ByRef(按地址傳遞)
2.具體理解方式:
具體這樣來理解:
(1)形參:
過程中的引數列表,我們稱形參
傳值時(ByVal),是先給形參開闢一個臨時地址,將實參的內容傳入這個臨時地址,這樣,傳遞後,形參與實參是在兩上不同的地址中,也就是說他們是相互獨立的
(2)實參:
呼叫過程時的引數列表,我們稱實參
傳址時(ByRef),是直接將實參的地址傳遞給形參,這樣,形參與實參就共用一個地址,所以,形參內容的改變,也直接改變了實參的內容
/************************************************************************/
*歸納:

在呼叫時,我們要將實參的值傳遞給形參,這樣過程才能拿這些資料參與計算並實現一些功能
那麼在傳遞的過程中,就存在這兩種傳遞方式
通過上面的分析,你只要記得:
按值傳遞時(ByVal),形參的改變不會影響到實參
按址傳遞時(ByRef),形參的改變,會影響到實參
/*********************************************************************/
3.範例
應用時,我們可以利用按址傳遞的過程,給一個子過程(Sub過程)進行引數返回
例:
Dim A as integer,B as integer
A=1
B=2
Call AAA(A,B)
Print A,B '得到的結果是2 3 (形參的改變影響到了實參)
Call BBB(A,B)
Pring A,B '得到的結果跟上面的一樣,2 3(形參的改變並沒有影響到這個實參)
Sub AAA(I as integer,J as integer) '預設,則按址傳遞
i=i+1
J=J+1
End Sub
Sub BBB(ByVal I as integer,ByVal J as integer)
i=i+1
J=J+1
End Sub