Solidity 值传递和引用传递详解(2023版)

Solidity中的两种类型传递:

  • 值类型传递memory;
  • 引用类型传递storage;
     

如果一个变量是值类型,那么当把它的值传给另一个变量时,是复制值,对新变量的操作不会影响原来的变量;如果该变量是引用类型,那么当它传值给另一个变量时,则是把该值的地址复制给新的变量。这样操作新变量也会导致旧变量的改变。

值类型:
布尔类型(bool)、整型(int)、地址类型(address)、定长字节数组(bytes)、枚举类型(enums)、函数类型(function);

如果一个变量是值类型,给它赋值时永远是值传递!

引用类型:
字符串(string)、数组(array)、结构体(structs)、字典(mapping)、不定长字节数组(bytes)

如果一个变量是引用类型,给它赋值时可以是值,也可以是引用,这决定于该变量是Storage类型还是Memory类型。

示例代码如下:

// SPDX-License-Identifier: Apache-2.0

pragma solidity ^0.8.7;

contract storage_demo{
    User adminuser;
    struct User{
        string name;
        uint8 age;
        string sex;
    }

    function setUser(string memory _name,uint8 _age,string memory _sex)public{
        adminuser.name=_name;
        adminuser.age=_age;
        adminuser.sex=_sex;
    }

    function getUser()public view returns(User memory){
        return adminuser;
    }

    function setAge1(uint8 _age)public{
        User memory user=adminuser;
        user.age = _age;
    }

    function setAge2(uint8 _age)public{
        User storage user=adminuser;
        user.age = _age;
    }
}

使用memory时,getUser的结果并未发生改变,说明memory并未改变原数据;而使用storage时数据发生了改变,说明其原数据已经出现变更。当然也可以通过下述方法进行修改:

function setAge(User storage _user,uint8 _age)internal{
        _user.age=_age;
}


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值