C/C#/java诡异的参数传递及其解释
先看下下面的C语言代码
#include <stdio.h> void s(char *b){ printf("%s\n",b); b="aaaa"; printf("%s\n",b); } int main(){ char *a="hello"; s(a); printf("%s\n",a); }
我的第一印象输出应改为
hello
aaaa
aaaa
但是这错了。
实际输出为
hello
aaaa
hello
是不是很诡异?
实际上想一想。
C语言参数传递的时候实际上是传值(指针也是传递指针的值),调用s(a)的时候,栈开辟一个参数区,将a的指针值传递过去。
当执行b="aaaa";语句的时候, 会将 参数区域的那个b指针值改变成"aaaa"的地址,但是 a的值是不会变的,所以main函数执行printf("%s\n",a);的时候会打印原先的值。
相似的原理,再来看看java代码。
public void extractXPS(StringWriter sw) { sw=new StringWriter(); sw.write("Hello World"); } void m(){ StringWriter sw=new StringWriter(); System.out.println(sw.toString()); }
请问执行方法m(),会产生什么样的输出?
结果只会输出"",就是说不会输出"Hello World"。
在java和C#中,对象参数实际传递的是一个引用(=指针),可以修改,但是若重新指向其他对象,跳出该方法后,对原先的调用者内的原对象没有影响。
转载请注明出处:http://www.cnblogs.com/stonehat/