一般会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++;
}改变函数参数本身对外部是无效的,只有改变参数所引用的内容对外部才是有效的。
#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++;
}改变函数参数本身对外部是无效的,只有改变参数所引用的内容对外部才是有效的。
解决方案 »
- 字符串和数组比较的问题
- " /* ... ^(*/)"的正则怎么写?
- Eclipse调试时,为什么断下来后就无法继续执行?
- 几道排列组合的题(一)请帮忙看看,,
- 输入5组英文,然后根据英文的首字进行排序输出~~~
- 一个线程同步的问题synchronized
- 十万火急!高手指点#####指点!!!!socket通信如何接收ascii码?在线等待,帮帮忙好吧?周末前一定结帖!
- 容器组件监听问题
- 通过ServerSocket起一个服务器 如何让外网的ip访问我的服务器
- 一个Class调用另外一个class的问题
- 如何给一个空的的JTable中增加ColumName和Row??--请给个实例谢谢!
- 初学者的初学问题?
然后,做b++,注意,这个b不是main()里面的b,而是modify()里面的b,于是,做完b++后,4500里存放的是1,然后modify()结束,释放临时空间。然而,自始至终,地址1003里面的数字并没有被改变过!!所以main()里面的变量b的值还是0。JAVA对传递参数的类型的不同,传递方式也是不一样的,只有对基础类型(int short long float char double byte boolean等)是在函数调用期间开辟临时空间,然后传递参数的值,所有操作都在临时空间里进行。而对于传递对象和其他类型(包括数组和String),都是直接在实际参数的地址上直接操作、修改,而不开辟临时空间!
传数组应该就是c中的传指针,虽然java说没有指针,多看一下c关于形参和实参应该就可以了,我好久没看忘了,不过String作为形参似乎不能直接修改,刚才试试确实不行,不过传递其他对象如Panel等,确实可以直接操作.
其实这个话题经久不衰,对string修改时,比较绕.
其实不要死抱着安值传还是按引用传,分析一下根源就可以.
main方法种声明了String s,并为其申请了内存空间,那么s这个引用种存放的只是这个内存的地址,可以理解在函数传递中,传递的是s中存放的地址,这个值是作为实参传过去的,所以不会被修改.
好,现在看看方法modify种的操作,s=s+"world",系统申请到了新的内存空间,
此时s的只会改变,但是并不会影响到原来在main方法的s,你打印的时外面的s,
当然结果时s.