关于参数传递

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

现在网上对Java和c++的参数传递机制争论不休,我个人觉得是陷入了概念理解的陷阱。实际上这两者的参数传递机制是完全一样的,只不过java在语言书写这方面做了简化,让程序员看不到指针,以加快开发速度。另外,关于参数类型是基本类型还是复杂类型,他们的传递机制也是一样的。其中传递的都是一个整数值。我们从内存块这一角度来分析的话,或许就能够发现其中奥秘。

c例子如下:

#include <iostream.h>

void exch(int *p1,int *p2);

int main()

{

int i =1,j=2;

cout<<"i="<<i<<",j="<<j<<endl;

exch(&i,&j);

cout<<"i="<<i<<",j<"<<j<<endl;

return 0;

}

void exch(int *p1,int *p2)

{

int* temp;

temp = p1;

p1 = p2;

p2 = temp;

}

结果为:

i=1,j=2

i=1,j=2

这一程序执行过程中内存变化如下:

执行exch之前内存分布如第一章图所示,这时候打印,结果应该是存储在0018和0019单元的1和2。

进入exch方法之后内存分布如第二张图所示,执行完毕exch方法之后内存分布如第三张图所示。这时候打印i和j当然依旧是存储在0018和0019单元的1和2。

在Java中的情形也是一样的。可以将传入exch方法的参数看成是变量i和j的地址,也就是这里的p1和p2是c++里*p1和*p2的简写。假如参数类型不是基本类型,而是引用类型,使用内存分布分析方法也能够得到正确结果(使用引用类型作为例子也许更加轻易理解)。在Java中需要注重的是String类,该类实例是不可变的,也就是每次对其做修改都会创建新的String对象,而旧的对象没有改变。

public class Test{

public static void main(String[] agrs){

Test t = new Test();

int i = 1;

int j = 2;

System.out.println(i);

System.out.println(j);

t.exch(i, j);

System.out.println(i);

System.out.println(j);

}

public void exch(int p1, int p2){

int temp = 0;

temp = p1;

p1 = p2;

p2 = temp;

}

}

结果为:

1

2

1

2

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航