一般会java的,多少懂点c/c++,搂主看看下面这段:
#include "stdio.h"
#include "string.h"void main () 
{
int[] a = new int[1];
modify(a);
printf("%d", a[0]); char[] s = "Hello";
modify(s);
printf("%s", s); int b = 0;
modify(b);
println("%d", b);
}
void modify(int[] a)
{
a[0]++; 
}
void modify(char* s)
{
s = new char[strlen(s) + 7 + 1];
sprintf("%s%s", s, " world!");
}
void modify(int b)
{
b++;
}改变函数参数本身对外部是无效的,只有改变参数所引用的内容对外部才是有效的。

解决方案 »

  1.   

    由于你在定义数组a时,并没有初始化a[0]的值,所以系统自动初始化为0。int [] a = new int [1];在你调用modify(a)时,由于参数a的类型是数组,并不是一个基本类型(int,char等属于基本类型),所以modify()函数直接对a[]进行操作,在函数调用后,a[]的数组元素的值也改变了。第二个也是同样的道理,由于String不是基本类型,所以modify(s)直接对s操作,修改了s的值为“Hello”而第三个就有所不同了。由于参数b为基本类型int,所以,当你调用modify(b)时,函数是在内存里重新开辟了一个临时存储点,把main()函数里的b的值放入这个临时存储点。然后对这个临时存储点进行++操作,而变量b的原先的存储地址里存放的值并没有变。譬如说,在main()函数里,为变量b分配的地址为1003,然后,1003地址存储的是0。然后,当你调用modify(b)时,系统为modify里的形式参数b分配了临时空间,地址为4500,然后,把1003地址里的值取出来,放到这个临时空间里,这时4500里存的数也是0了!
    然后,做b++,注意,这个b不是main()里面的b,而是modify()里面的b,于是,做完b++后,4500里存放的是1,然后modify()结束,释放临时空间。然而,自始至终,地址1003里面的数字并没有被改变过!!所以main()里面的变量b的值还是0。JAVA对传递参数的类型的不同,传递方式也是不一样的,只有对基础类型(int short long float char double byte boolean等)是在函数调用期间开辟临时空间,然后传递参数的值,所有操作都在临时空间里进行。而对于传递对象和其他类型(包括数组和String),都是直接在实际参数的地址上直接操作、修改,而不开辟临时空间!
      

  2.   

    如果象楼上所说,则输出应该为1,helloworld,0
    传数组应该就是c中的传指针,虽然java说没有指针,多看一下c关于形参和实参应该就可以了,我好久没看忘了,不过String作为形参似乎不能直接修改,刚才试试确实不行,不过传递其他对象如Panel等,确实可以直接操作.
      

  3.   

    回复:koala999(koala)在JAVA里面,String是当作对象来看的,跟数组一样,直接在实参的地址上操作!!否则刚才程序的输出怎么会是 1,Hello,0 呢?你刚才是怎么试的,发代码上来看看好吗
      

  4.   

    楼上考虑得到不全面,而且因果关系确实不对.如果找你所说,在实参的地址上操作,结果应该是hello world
    其实这个话题经久不衰,对string修改时,比较绕.
    其实不要死抱着安值传还是按引用传,分析一下根源就可以.
    main方法种声明了String s,并为其申请了内存空间,那么s这个引用种存放的只是这个内存的地址,可以理解在函数传递中,传递的是s中存放的地址,这个值是作为实参传过去的,所以不会被修改.
    好,现在看看方法modify种的操作,s=s+"world",系统申请到了新的内存空间,
    此时s的只会改变,但是并不会影响到原来在main方法的s,你打印的时外面的s,
    当然结果时s.