浅析值传递和引用传递

值传递和引用传递的区别

  • 值传递是在方法函数入栈之后,将变量拷贝一份进入方法中。如果变量是基本类型,则直接进入方法函数的栈中;如果是引用类型变量,则与实参指向同一块堆区域。详情可见Java中的内存机制。
    值传递可以传递基本类型数据和引用类型数据的地址。

  • 引用传递是指在函数方法入栈后,将实际参数的地址直接传递到函数中。因此,在函数方法中对参数进行修改,将影响到实际参数的值。
    引用传递传递的是句柄(也就是变量)本身的地址。

Java中只存在值传递(代码测试)

class Person {
    public String name;
    public Integer age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Test {
    public static void change1(int x1,int x2){
        int x3 = x1;
        x1 = x2;
        x2 = x3;
    }
    //这里交换的是方法change2中的person1和person2变量的指向
    //实际上堆中存放的数据并没有改变,主函数中的person1和person2的指向也没有改变
    public static void change2(Person person1,Person person2){
        Person person3 = person1;
        person1 = person2;
        person2 = person3;
    }
    //由于传入的是person1,person2的地址
    //change3可以对其指向的堆中的数据进行更改
    //因此,引用类型变量的属性值发生变化
    public static void change3(Person person1,Person person2){
        int age = person1.age;
        person1.age = person2.age;
        person2.age = age;
    }
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        Person person1 = new Person();
        Person person2 = new Person();
        person1.age = 11;
        person2.age = 12;
        change1(a,b); 
        //result: a = 10,b = 20
        System.out.println(a + "   " + b);
        change2(person1,person2); 
        //result: person1.age = 11,person2.age = 12
        System.out.println("" + person1 + "   " + person2);
        change3(person1,person2); 
        //result: person1.age = 12,person2.age = 11
        System.out.println("" + person1 + "   " + person2);

    }
}

Java测试结果

C++中存在引用传递(代码测试)

struct Person {
    std::string name;
    int age;

    std::string toString() const {
        return "Person{name='" + name + "', age=" + std::to_string(age) + "}";
    }
};
void change1(int& x1, int& x2) {
    int x3 = x1;
    x1 = x2;
    x2 = x3;
}

void change2(Person*& person1, Person*& person2) {
    Person* person3 = person1;
    person1 = person2;
    person2 = person3;
}

void change3(Person* person1, Person* person2) {
    int age = person1->age;
    person1->age = person2->age;
    person2->age = age;
}

int main() {
    int a = 10;
    int b = 20;

    Person* person1 = new Person();
    Person* person2 = new Person();

    person1->age = 11;
    person2->age = 12;

    change1(a, b);
    // result: a = 20, b = 10
    std::cout << a << "   " << b << std::endl;

    change2(person1, person2); 
    // result: person1->age = 12, person2->age = 11
    std::cout << person1->toString() << "   " << person2->toString() << std::endl;

    change3(person1, person2); 
    // result: person1->age = 11, person2->age = 12 (再次交换)
    std::cout << person1->toString() << "   " << person2->toString() << std::endl;

    delete person1;
    delete person2;

    return 0;
}

cpp测试结果

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用传递在不同的编程语言中可能有不同的实现方式。一般情况下,引用传递的时候会传递变量的内存地址,而不是变量的值。这意味着在函数内部对形参的修改会影响实参的值。然而,有些编程语言会将引用传递当作值传递来实现,即传递的是变量的副本而不是内存地址。 在Python中,函数参数的传递是按值传递的。也就是说,当我们将一个变量作为参数传递给函数时,实际上是将该变量的值进行了复制,而不是传递变量本身的引用。因此,在函数内部修改参数的值不会影响到原始变量的值。这可以通过以下代码示例进行说明: ```python def modify_value(x): x = 10 num = 5 modify_value(num) print(num) # 输出结果为5 ``` 在上述代码中,我们定义了一个名为`modify_value`的函数,该函数将传入的参数`x`赋值为10。然后我们定义了一个变量`num`并将其赋值为5,然后调用`modify_value`函数并将`num`作为参数传递给它。尽管在函数内部将`x`赋值为10,但是在函数外部打印`num`的值仍然是5,说明在函数内部修改参数的值并不会影响到原始变量的值。 因此,可以得出结论,在Python中,引用传递实际上是按值传递的。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [深入理解python中函数传递参数是值传递还是引用传递](https://download.csdn.net/download/weixin_38682790/12871930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [深入浅析JS是按值传递还是按引用传递(推荐)](https://download.csdn.net/download/weixin_38593738/13156754)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值