Byval은 매개 변수 메모리의 사본을 Callee로 전송합니다. 다시 말해, 스택으로 직접 푸시되는 값은 전달 된 값입니다.
Byref는 매개 변수 메모리의 실제 주소를 Callee로 전송합니다. 다시 말해, 스택에 누르면 실제 내용의 주소입니다. Callee는 주소의 내용을 직접 변경할 수 있습니다.
ByVal은 수정되지 않을 값 소스 데이터입니다.
이 값을 자신의 로컬 변수로 사용할 수 있습니다.
Byref는 통과 주소이며 소스 데이터를 수정할 수 있습니다.
이 변수에 대한 작업은 포인터 느낌과 마찬가지로 전달하는 변수에 영향을 미칩니다.
예:
코드 사본은 다음과 같습니다.
Subadd1 (byvalnoasint32)
아니오 = NO+100
Endsub
Subadd2 (byrefnoasint32)
아니오 = NO+100
Endsub
privatesubbutton1_click (senderasobject, easventargs) handlesbutton1.click
dimaasint32
a = 100
add1 (a)
msgbox ( "a is :"& a)는 a의 값이 100임을 보여줍니다.
add2 (a)
msgbox ( "a is :"& a) '는 ad2의 매개 변수가 Byref이기 때문에 a의 값이 200임을 보여줍니다.
'주소로 통과하므로 ADD2에서 NO를 수정 한 후
'소스 매개 변수 a의 값도 수정됩니다.
Endsub
——————————————————————————————————————
3. Byval과 Byref
파라미터 값은 Byval에 의해 전달되고 매개 변수의 주소는 Byref에 의해 전달됩니다. 여기서는 포인터/주소/참조를 구별 할 필요가 없습니다. VB에서는 단순히 한 가지에 대한 세 가지 다른 진술입니다. VB 문서 조차도이 용어와 혼합되어 있습니다 (그러나 C ++에서는 포인터와 참조를 구별해야합니다).
위의 프로그램에 처음 노출 된 친구 2 Swapptr는 Byval을 추가 할 위치와 추가하지 않아야 할 위치를 파악해야합니다 (Byval을 추가하지 않으면 VB의 기본 Byref를 사용하는 것입니다).
통과 값과 통과 주소 (포인터)의 차이를 정확하게 이해하는 것은 VB에서 포인터를 올바르게 사용하기위한 기초입니다.
이제 가장 간단한 실험은 다음 절차 3과 같은이 문제를 보는 데 사용됩니다.
program 3】 : Byval 및 Byref 경험
코드 사본은 다음과 같습니다.
하위 테스트 시민성 ()
DIM K
k = 5
참고 : copymemory byval varptr (k), 40000, 4
디버그 프린트 k
종료 서브