壹、 按值與按地址方式的內涵
按值傳遞參數,實質上是將實參的值復制壹份給形參,因此形參獲得的是實參的副本,當過程執行中對形參進行改變,並不會影響實參本身;按地址傳遞參數,實質上是將實參變量的地址傳遞給形參,因此形參與實參將指向同壹內存單元,當過程執行中形參發生改變時,對應實參也將跟著改變。
二、 參數傳遞方式判別方法
判斷參數傳遞方式,不能單純的看過程定義中形參前的修飾限定詞有無byval。參數傳遞到底采用何種方式,不僅取決於過程定義,還取決於過程調用,即與對應實參的具體形式也有很大關系。因此,應該從以下三個方面綜合考慮:
1. 形參是否為數組或者控件
2. 形參前是否有byval修飾
3. 對應實參是否為表達式或者值
具體判別方法,請見如下判別流程圖。
三、不同傳遞方式對參數類型的要求
若參數按地址傳遞,則vb要求實參的數據類型與形參的數據類型完全壹致;若參數按值傳遞,則實參數據類型不要求與形參完全壹致,但是必須能夠由vb默認轉化。
四、解題應用
(壹) 以江蘇省計算機等級考試2001年春季的壹道考題為例:
在應用程序中用?private function fun(x as integer, y as single)?定義了函數fun. 調用函數fun的過程中的變量i,j均定義為 integer型,能正確引用函數fun的是____
①fun(i,j) ②call fun(i,3.65)
③fun(3.14,234) ④fun(?245?, ?231.5?)
a.①③ b.②③④ c.①②③ d.①②③④
分析:
1. 根據判別流程圖,對每個引用做如下判斷:
對於①fun(i,j),實參i與形參x匹配,由於形參x不是數組並且無byval修飾,而實參i為變量,不是值或表達式,因此該參數將按照地址傳遞;同理,可以推斷實參j與形參y也將按照地址傳遞。根據vb要求,按照地址傳遞的實參和形參數據類型必須完全壹致,而根據題意,j為integer,y為single,因此①不正確;對於②call fun(i,3.65),i與x按地址傳遞;而實參3.65為值,與形參y匹配時,將按值傳遞,因此②正確;對於③fun(3.14,234),雖然實參3.14對應的形參x為integer,實參234對應的形參y為single,但由於它們都是按照值傳遞,因此3.14將轉化為3,而234可以直接賦給y,因此③正確;對於④fun(?245?, ?231.5?),由於實參?245?和?231.5?均為字符串值,因此其與對應形參x、y將按照值傳遞,而數字字符串是可以轉化為數值類型的,因此④正確。
綜上所述,正確答案為b。
2. 對於該題,由於要求是?能正確引用函數fun的是?,因此,③④雖帶括號,並且無call引導,但卻可以通過諸如:print fun(3.14,234)加以引用。若改為:?能正確調用函數fun的語句是?,則此時③④不可選,只能選②。
(二) 以江蘇省計算機等級考試2002年春季的壹道考題為例:
調用由語句private sub convent(y as integer)定義的sub過程時,以下不是按值傳遞的語句____。
a.call convent((x)) b.call convent(x*1)
c.convent(x) d.convent x
分析:
1. 對於a、b選項,實參分別為(x)和x*1,均為表達式,因此a、b選項中的實參將按照值傳遞;對於d選項,實參x未用括號引導,此時不可加call,因此語句正確,同時,根據判別流程圖,實參x與形參y必按地址傳遞。分析至此,對於該題為單選題,已經可以斷定答案是d。
2. 現在考慮c選項語句convent(x)帶括號,但卻無call引導,因此直覺上似乎不能正確執行。但若我們在vb代碼編輯器中輸入該句,回車後,該語句自動調整為:convent (x),註意此時convent與(x)之間有壹個空格,因此該句中的括號是用於x,而不是用於convent,所以盡管無call引導但其卻能夠執行,此時實參為(x),因此參數將按值傳遞。所以對於call convent(x)和convent(x),雖然都能執行,並非是由於convent(x)前可以省略call,而在於它們的實參分別是x和(x),其傳遞參數的方式自然就不同。
(三) 閱讀程序寫出運行結果:
private sub form_click()
dim x as integer, y as integer, z as integer
x = 1: y = 2: z = 3
call sub1(x, y, y)
print x,y,z
end sub
private sub sub1(x as integer, y as integer, byval z as integer)
dim i as integer
x = 3 * z: y = 2 * z: z = x y
print x, y, z
end sub
分析:
根據判別流程圖知,第壹、二參數按地址傳遞,第三參數按值傳遞。因此第壹、二形參與對應實參指向同壹內存單元,而第三形參與對應實參值相同,但卻指向不同內存單元。因此,可以作出如下參數傳遞與過程調用示意圖。
雖然實參和形參均為x、y、z,但是請註意區分,它們具有不同的作用域。
經分析,最後答案為:
6 4 10
6 4 3
vb過程中使用的參數分為實參和形參,簡單的講,在過程定義中給定的參數是形參,而在過程調用語句中給定的參數是實參。當調用壹個有參數的過程時,形參和實參逐壹匹配傳遞,根據傳遞方式不同,可分為按值和按地址兩種。對參數傳遞方式的正確判別是過程學習中的壹個難點,也是等級考試中的壹個考點。
壹、 按值與按地址方式的內涵
按值傳遞參數,實質上是將實參的值復制壹份給形參,因此形參獲得的是實參的副本,當過程執行中對形參進行改變,並不會影響實參本身;按地址傳遞參數,實質上是將實參變量的地址傳遞給形參,因此形參與實參將指向同壹內存單元,當過程執行中形參發生改變時,對應實參也將跟著改變。
二、 參數傳遞方式判別方法
判斷參數傳遞方式,不能單純的看過程定義中形參前的修飾限定詞有無byval。參數傳遞到底采用何種方式,不僅取決於過程定義,還取決於過程調用,即與對應實參的具體形式也有很大關系。因此,應該從以下三個方面綜合考慮:
1. 形參是否為數組或者控件
2. 形參前是否有byval修飾
3. 對應實參是否為表達式或者值
具體判別方法,請見如下判別流程圖。
三、不同傳遞方式對參數類型的要求
若參數按地址傳遞,則vb要求實參的數據類型與形參的數據類型完全壹致;若參數按值傳遞,則實參數據類型不要求與形參完全壹致,但是必須能夠由vb默認轉化。
四、解題應用
(壹) 以江蘇省計算機等級考試2001年春季的壹道考題為例:
在應用程序中用?private function fun(x as integer, y as single)?定義了函數fun. 調用函數fun的過程中的變量i,j均定義為 integer型,能正確引用函數fun的是____
①fun(i,j) ②call fun(i,3.65)
③fun(3.14,234) ④fun(?245?, ?231.5?)
a.①③ b.②③④ c.①②③ d.①②③④