c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...
大家好,我們今日繼續(xù)講解VBA代碼解決方案的第125講內容:關鍵字ByVal和ByRef的作用。在上一節(jié)中我們講到了形式參數(shù)和實際參數(shù)的定義,同時講到了從實際參數(shù)傳遞給形式參數(shù)的過程中按值傳遞和按地址傳遞的不同。為了更好的說明按值傳遞和按地址傳遞的區(qū)別,我們把上節(jié)的程序做一些修正:在函數(shù)聲明行去掉參數(shù)a前面的關鍵字ByVal,結果會怎樣呢?代碼如下:
Sub MynzNumbers_1()
Dim a As Integer, b As Integer, c As Integer
a = 10
b = 20
c = 30
MsgBox MyAverage_1(a, b, c) & " " & a & " " & b & " " & c
End Sub
Function MyAverage_1(a, ByVal b, ByVal c)
a = a + 60
MyAverage_1 = (a + b + c) / 3
End Function
大家想想這時的結果該是怎么樣呢?如下面的截圖:
函數(shù)的結果仍然相同,但是函數(shù)MsgBox顯示的變量a的內容現(xiàn)在是70了。說明這時就改變了儲存在變量a里的原始數(shù)值。
上面的過程如何理解呢?
① 每個要傳遞給函數(shù)過程(或子程序)的變量,都可能在接收時改變數(shù)值,是否需要保護變量的原始數(shù)值是非常重要的。
② VBA有兩個關鍵字,提供是否認可改變變量內容的允許——ByRef和 ByVal,但要注意VBA默認地按地址(關鍵字ByRef)給函數(shù)過程(或子程序)傳遞信息,引用函數(shù)被調用時,函數(shù)參數(shù)會按地址傳遞數(shù)據(jù)。因此,如果函數(shù)改變了參數(shù)值,原始的數(shù)值就被改變了。
③ 在上面的例子中,函數(shù)MyAverage_1聲明參數(shù)a的前面去掉了關鍵字ByVal時,你就會得到按地址傳遞參數(shù)的結果。如果你想要函數(shù)過程 改變原始數(shù)值,你不必專門在參數(shù)前加關鍵字ByRef,因為,變量數(shù)值的傳遞默認就是ByRef。
本節(jié)的最后我們再談一下按值傳遞的過程是如何進行的,當你在參數(shù)名稱前使用關鍵字ByVal時,這意味著VBA復制一份原始數(shù)據(jù),然后將復制 值傳遞給函數(shù),如果函數(shù)改變了參數(shù)的數(shù)值的話,原始數(shù)據(jù)依然不會變——只有復制值變化。這就是為什么函數(shù)MyAverage改變了變量a的數(shù)值,而它的原始值還保持不變了。
如果你對上述過程還是不清楚,我再做一個更加形象的說明:
①按址傳遞時,實質上實際參數(shù)是把指針(地址)傳遞給形式參數(shù)了,這時指針指向的地址的值即是實際參數(shù),此時形式參數(shù)與實際參數(shù)分別有一個指針,但同時指向同一個地址。
②按數(shù)值遞時,實質上實參是把復制后的數(shù)值傳遞給形參了,這個時候實際參數(shù)和形式參數(shù)具有不同的指針,形式參數(shù)的指針指向的地址是復制后數(shù)值的地址指針,此時實際參數(shù)的指針沒有發(fā)生改變。
今日內容回向:
1 按值傳遞和按地址傳遞的關鍵字是什么?
2 如何理解兩種傳遞過程中的指針不同?
總結
以上是生活随笔為你收集整理的c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始发布前端代码到服务器上_无服务器
- 下一篇: python大神的成长之路_Python