java只能是值传递;c可以引用传递
指针:指针是一个变量,存储的是一个内存单元的地址
引用:是原来变量的一个别名
值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
eg1:参数是普通变量
public static void main(String[] args) {
int i = 5;
set(i);
System.out.println("main:"+i);
}
private static void set(int i) {
i = 10;
System.out.println("set:"+i);
}
输出: //set:10 //main:5
结论:i并没有被修改,创建了副本,方法中无法修改原始值
eg2:参数是引用
public static void main(String[] args) {
User user=new User();
user.setName("zhangsan");
set(user);
System.out.println("main:"+user.getName());
}
private static void set(User setUser) {
user.setName("lisi");
System.out.println("set:"+user.getName());
}
输出: //set:lisi //main:lisi
结论:虽然User的name值确实被修改,但是仍然不是引用传递;因为传递过来的setUser是一个地址,并没有对这个地址做修改,而是对这个地址指向的内容做了修改
eg3:参数是引用,对比eg2
public static void main(String[] args) {
String name = "zhangsan";
set(name);
System.out.println("main:" + name);
}
private static void set(String name) {
name = "lisi";
System.out.println("set:" + name);
}
输出: //set:lisi //main:zhangsan
结论:同样参数是引用,这次值并没有被修改;因为name=“lisi”,相当于name=new String(“lisi”),重新开辟了空间,所以不会被修改
最后结论:java都是“值传递”,简单变量就是复制了具体值,引用变量就是复制了地址;都是会创建副本的,所以对副本的修改不会影响到原值