Byvalは、パラメーターメモリのコピーをCalleeに転送します。言い換えれば、スタックに直接プッシュされる値は、合格した値です。
BYREFは、パラメーターメモリの実際のアドレスをCalleeに送信します。言い換えれば、スタックに押し込まれているのは、実際のコンテンツのアドレスです。 Calleeは、アドレス内の内容を直接変更できます。
byvalは、変更されない値ソースデータです
この値を独自のローカル変数として使用できます
BYREFはパスアドレスであり、ソースデータが変更される場合があります
この変数の操作は、ポインターの感覚のように、あなたが渡す変数に影響を与えます
例:
コードコピーは次のとおりです。
subadd1(byvalnoasint32)
いいえ=いいえ+100
Endingub
subadd2(byrefnoasint32)
いいえ=いいえ+100
Endingub
privatesubbutton1_click(senderasobject、easventargs)handlesbutton1.click
dimaasint32
a = 100
add1(a)
msgbox( "a is:"&a) 'は、aの値が100であることを示しています
add2(a)
msgbox( "a is:"&a) 'は、a add2のパラメーターnoがbyref、つまり、aの値が200であることを示しています。
'住所で渡されたので、add2を変更した後、それは原因となります
'ソースパラメーターAの値も変更されます。
Endingub
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-
3。byvalおよびbyref
byvalで渡されたパラメーター値と、byrefで渡されたパラメーターのアドレス。ここでは、ポインター/アドレス/参照を区別する必要はありません。 VBでは、それらは1つのことに関する3つの異なる声明です。 VBドキュメントでさえこれらの用語と混合されています(ただし、C ++では、ポインターと参照を区別する必要があります)
上記のプログラムに最初にさらされている友人2 SWAPPTRは、byvalを追加する場所と追加しない場所を把握する必要があります(byvalを追加しないことは、VBのデフォルトBYREFを使用することです)
通過値と通過アドレス(ポインター)の違いを正確に理解することは、VBでのポインターを正しく使用するための基礎です。
これで、次の手順3など、この問題を調べるために最も単純な実験が使用されます。
【プログラム3】:byvalとbyrefを経験します
コードコピーは次のとおりです。
sub testcopymemory()
dim kの長さ
k = 5
注:Copymemory byval varptr(k)、40000、4
debug.print k
End Sub