Solidity基础(5)--数据地址(memory,storage,calldata)

本文介绍了Solidity中的数据位置概念,包括强制数据位置、默认数据位置以及转换问题。memory用于临时存储,作用域结束后数据会被回收;storage用于持久存储,数据会一直存在;calldata用于外部函数只读参数。在不同数据位置间进行转换时,如storage到memory是拷贝,而memory到storage则会根据具体情况采取值传递或报错。

引用类型在Solidity中有一个额外的属性,数据的存储位置。可选为memory和storage。

memory:存储位置同我们普通程序的内存一致。即分配,即使用,越过作用域即不可被访问,等待被回收。
storage:这种类型了,一旦使用这个类型,数据将永远存在。
calldata:它存储的是函数参数,是只读的,不会永久存储的一个数据位置。外部函数的参数(不包括返回参数)被强制指定为calldata。效果与memory差不多。

强制的数据位置

    外部函数(External function)的参数(不包括返回参数)强制为:calldata
    状态变量:强制为: storage

pragma solidity ^0.4.0;
contract StateVariable{
      struct S{string a;uint b;}
      //状态变量,默认是storage
      S s;
}
默认数据位置

    函数参数返回参数:memory
    局部变量:storage

pragma solidity ^0.4.0;
contract SimpleAssign{
  struct S{string a;uint b;}
  function assign(S s) internal{ //默认参数是memory
  //默认的变量是storage的指针
  //S tmp = s; 报错
  }
}
这里将一个memory类型的参数赋值给storage类型的局部变量会报错
转换问题:

1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值