VB中传值引用和传地址引用是干什么用的

 我来答
荒诞的热水Tm
2010-06-22
知道答主
回答量:16
采纳率:0%
帮助的人:0
展开全部
准确地说,应该是在调用函数时,参数是传值还是传地址,本质上它们都是用来进行数据传递,不过有着重要的区别,下面以一段Java代码(来自网上)为例说明。
class BirthDay...{

private int day;
private int month;
private int year;

BirthDay(int d,int m,int y)...{
day=d;
month=m;
year=y;
}

public void setDay(int d)...{

day=d;

}

public void setMonth(int m)...{

month=m;

}

public void setYear(int y)...{

year=y;

}

public void display(BirthDay b)...
{

System.out.println"day="+b.day+"month="+b.month+"year="+b.year);
}
}

public class BirthDayTest...{

public void charge(int b)...{
b=100;
}

public void charge1(BirthDay b)...{
b=new BirthDay(23,3,2007);
}

public void charge2(BirthDay b)...{
b.setDay(100);
}

public static void main(String args[])...{

BirthDayTest test=new BirthDayTest();

int Date=23;

BirthDay b1=new BirthDay(15,7,1983);

BirthDay b2=new BirthDay(20,1,2007);

test.charge(Date);
System.out.println("date="+Date);
test.charge1(b1);
b1.display(b1);
test.charge2(b2);
b2.display(b2);
}
}
上述程序的运行结果是:

date:date=23
b1:day=15month=7year=1983
b2:day=100month=1year=2007

显然,通过调用charge(int d)方法,date的值并没有改变,这是因为调用该方法时,java就给局部变量d分配了一个临时内存即d=date,在执行方法体的时候,d被赋值为100。但整个过程中date的值还是23,并没有改变。(这是传值调用)

但是,在调用charge1(BirthDay d)时,给局部变量d在栈内分配了个一个内存空间,这个内存空间存放的是传过来的地址,即d和b1同时指向了一个堆空间(同一变量),在执行方法体的d又被指向了另一个堆内存。但b1还是指向以前的那个堆空间,即b1的值并没有改变。(传地址调用)

同理,在调用charge2(BirthDay d)时,d和b2都指向了同一个堆内存空间,在执行方法体的时候,给d指向的day这个属性赋予了新的值。那么也就相当于b2的值改变了一样。(传地址调用)

上面通过一个例子说明了传值调用和传地址调用的区别。另外还有几点需要说明的是:
1、java语言中并没有像c++那样的显式指针,但java中的引用就相当于c++的指针。VB也似乎也是如此。
2、new出来的对象是存放在堆内存(heap)中的,局部变量和static成员变量一样存放在栈内存(stack)中。
3、当方法中的参数为数组类型的时候,数组也是运用的传地址调用。

参考资料: http://sjweb.hhit.edu.cn/discussion/user_view.asp?action=view&id=301520

hst0012008
2010-06-22 · TA获得超过367个赞
知道小有建树答主
回答量:373
采纳率:0%
帮助的人:333万
展开全部
这个打个比喻很好理解:

比如有a,b两个变量,将a的值传给b,b=a
如果用传值引用,那么后续b的值怎么改变与a无关
如果用传址引用,那么后来如果b的值变了,那么a也跟着变,保持同步
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chenxfsoft
2010-06-22 · TA获得超过1381个赞
知道大有可为答主
回答量:2418
采纳率:0%
帮助的人:1889万
展开全部
sub a(byval x as integer)
x=x+1
end sub

sub b(byref x as integer )
x=x+1
end sub
上面2个区别看测试代码
dim n as integer
n=0
a(n)
msgbox n

n=0
b(n)
msgbox n

测试结果,byval不会改变n的值,byref 改变了n值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式