美文网首页
solidity的变量存储

solidity的变量存储

作者: 攻城老狮 | 来源:发表于2020-07-25 14:19 被阅读0次

    状态变量与局部变量

    状态变量:保存在区块链(合约)中的变量被称为状态变量

    局部变量:函数的参数,返回参数以及在函数内部定义的变量称为局部变量

    值类型和引用类型

    值类型:值类型传递时,会临时拷贝一份内容,而不是拷贝指针。当修改新的变量时,不会影响原来变量的值。

    • 布尔(bool)
    • 整型(int/uint)
    • 地址(address)
    • 定长字节数组(bytes1,bytes2...bytes32)
    • 有理数和整数字面值常量
    • 枚举类型(enum)
    • 函数类型

    引用类型:引用类型可以通过多个不同的名称修改它的值,这是因为新的变量同时指向同一个地址的原因。

    • 不定长字节数组(bytes)
    • 字符串(string)
    • 数组(array)
    • 结构体(struct)

    引用类型的 memory 和 storage存储位置

    1. memory和storage的说明
      • memory:表示变量存储在内存中
      • storage:表示变量存储在区块链中
    2. 不同数据类型的变量默认的存储位置
      • 状态变量总是会存储在storage 中
      • 局部变量
        • 函数参数和返回值默认存放在 内存memory 中
        • 引用类型变量(结构、数组或映射类型)的局部变量,默认会存储在storage中
        • 值类型变量(除结构、数组及映射类型之外的简单类型),会储存在memory栈中
    3. 案例
      • memory赋值给局部变量
      • storage转storage
      • memory赋值给状态变量
      • storage转memory
      • memory转memory
    pragma solidity ^0.4.17;
    
    contract VarTest{
        string public name = "init";
        
        //memory赋值给局部变量
        function memoryToLocalval(string _name) pure public returns(string){
            string memory localName = _name;
            return localName; 
        }
        
        //storage转storage
        function storageToStorage(string storage _name) internal returns(string){
            string storage localName = _name;
            //error
            //localName = "yorick";
            bytes(localName)[0] = "h";
            return localName;
        }
        function callStorageToStorage() public returns(string){
            return storageToStorage(name); //状态变量的 init 变为 hnit
        }
        
        //memory赋值给状态变量,赋值之后再更改局部变量,不会影响状态变量
        function memoryToStorage(string _name) public{
            name = _name;
            _name = "hehe";
        }
        
        //storage转memory
        function storageToMemory(string storage _name) pure internal returns(string){
            string memory localName = _name;
            //此处修改局部变量不会影响状态变量
            localName = "hehe";
            return localName;
        }
        function callStorageToMemory() view public returns(string){
            return storageToMemory(name);
        }
        
        //memory转memory
        function memoryToMemory(string _name) pure internal{
            string memory localName = _name;
            bytes(localName)[0] = "h";
            //修改不会影响_name的值,可能是由于赋新的字符串指针执行另外的空间了
            //localName = "hehe";
        }
        function callMemoryToMemory() pure public returns(string){
            string memory localName = "yoyo";
            memoryToMemory(localName);
            return localName; //hoyo
        }
        
    }
    

    相关文章

      网友评论

          本文标题:solidity的变量存储

          本文链接:https://www.haomeiwen.com/subject/khaplktx.html