solidity的变量存储
发布日期:2021-06-29 00:58:40 浏览次数:2 分类:技术文章

本文共 2127 字,大约阅读时间需要 7 分钟。


状态变量与局部变量

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

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

值类型和引用类型

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

  • 布尔(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    }    }

转载地址:https://blog.csdn.net/yorickjun/article/details/116645811 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:nginx负载均衡实例配置
下一篇:Redis的基本数据类型

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月19日 06时33分49秒