solidity之storage和memory以及值传递与引用传递以及private、internal、public、external之间的关系总结大全

本文深入探讨了Solidity中storage和memory的概念及其在智能合约中的应用,详细解析了变量的存储位置、生命周期以及引用赋值与拷贝赋值的区别。通过具体示例,讲解了不同修饰符下函数参数的引用类型限制,以及状态变量间数组赋值的独立拷贝特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:这里的关系主要正对于contract合约类型,而对于library又不一样!

关于storage和memory及private、public、internal、external直接的关系



pragma solidity ^0.5.0;

contract Test {

    // 全局状态变量默认默认都是storage(存于区块链中,永久存在)
    uint int_a = 1;
    // 全局复杂引用变量默认都是storage(存于区块链中,永久存在)
    uint[] public ref_a = [1,2,3];
    
    // 局部非引用变量或非引用类型参数默认都是memory(存取EVM内存,用完立即销毁)
    function local_var(uint x) public {
        uint a = 1;
    }

    // 局部引用变量必须指定storage或memory
    function local_ref(uint[] storage s) internal {
        // 0.5.0版本以后,局部复杂引用类型变量必须指定storage或memory,且必须赋值
        uint[] memory x = s;
        uint[] storage y = s;
    }
    
     //只要是storage赋值storage或memory赋值memory都是引用赋值
    function test_storage() internal {
        ref_internal(ref_a); //storage赋值storage是引用赋值,相互改变!
    }

    //只要是memory赋值storage或storage赋值memory都是拷贝赋值
    function test_memory() private {
        ref_private(ref_a); //storage赋值memory是拷贝赋值,相互不影响!
    }
    
    


    // private类型函数的函数参数引用类型必须是storage或memory
    function ref_private(uint[] memory s) private {
        s[0] = 2019;
    }
    // internal类型函数的函数参数引用类型必须是storage或memory
    function ref_internal(uint[] storage s) internal {
        s[0] = 2019;
    }
    // public类型函数的函数参数引用类型只能是memory
    function ref_public(uint[] memory s) public {
        s[0] = 2019;
    }
    // external类型函数的函数参数引用类型只能是calldata
    function ref_external(uint[] calldata s) external {
        //这里无法修改s的值!!!
    }

    
}


关于状态变量之间的storage数组直接的拷贝赋值!

pragma solidity ^0.5.0;

contract Test {

    // 全局复杂引用变量默认都是storage(存于区块链中,永久存在)
    uint[] public ref_a = [1,2,3];
    // new关键字创建的storage类型的数组(注意:new既可以创建memory数组也可以创建storage数组)
    uint[] public ref_b = new uint[](8);
    
    
    function chang_array() public returns(uint){
        // ref_b和ref_a都是状态变量,状态变量之间的赋值完全独立拷贝!(切记)
        ref_b = ref_a;
        ref_b[0] = 10;

    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值