参数的传递

来源:互联网 发布:国外网络域名 编辑:程序博客网 时间:2024/05/22 07:46
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作。方法执行中开式参数值勤的改变将影响实际参数的值。
例如:
#include <stdio.h>
void change_by_value(int x){
    x=x+10;
}
void change_by_address(int *x){
    *x=*x+10;
}
void main(){
    int a=3;
    printf("a=%d/n",a);
    change_by_value(a);
    printf("a=%d/n",a);//a的值并没有改变
    change_by_address(&a);
    printf("a=%d/n",a);//
}
运行结果:
3,3,13
传值方式:
void change_by_value(int x)内部发生的动作应当是当函数被调用时(堆栈调用)
在堆栈上临时分配了一块区域,调用结束,出栈。
void change_by_value(int x){
    int _x=x;//拷贝一份传递给临时变量_x
    _x=_x+10;//改变的是_x,不是x
}
地址传递方式:参数是地址
void change_by_address(int *x){
    *x=*x+10;
}
实参和行参共享一个存储单元,对行参的操作相应的就改变了实参,此时参数传递是双向的。
此外,参数的存储位置和变量的存储属性对参数传递也有影响,变量的存储属性有动态变量、静态变量
外部变量,动态变量有2种,自动(auto)和寄存器(register)变量。
在java 中同样如此
public class PassTest {
    float ptValue;
    public void  changeInt(int value){
       value=value+value;
    }
    public void chanageString(String value){
        value=new String("diffent");
    }
    public void changeObjectValue(PassTest ref){
        ref.ptValue=99.0f;
    }
    public static void main(String args[]){
        String str;
        int val;
        PassTest pt=new PassTest();
        val=11;
        pt.changeInt(val);
        System.out.println(val);
        str=new String("hello");
        pt.chanageString(str);
        System.out.println(str);
        pt.ptValue=101.f;
        pt.changeObjectValue(pt);
        System.out.println(pt.ptValue);
    }
}
运行结果:
11
hello
99.0
注意要看清是否有返回值:
若把public void  changeInt(int value){    改为  public int changeInt(int value){       value=value+value;                           value=value+value;
    }                                               return value;
                                                   }
把 pt.changeInt(val); 改为val=pt.changeInt(val);
运行结果:
22
hello
99.0