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