solidity 变量的存储01

在这里插入图片描述// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
/*
引用类型
数组 sring byte
结构体 struct
映射 mapping
引用类型必须指定数据的位置
存储位置
在合约中声明的变量都有一个存储位置,用于指明变量的值存储在哪里
storage
memory
calldata
storage:链上存储空间,该存储位置用于永久存储数据,只要合约存在数据就一直有效,存储的gas较高
其中:
状态变量的存储强制为storage
局部变量的可以具体声明
映射只能存储到storage中
memory:内存存储,即数据存储在内存中,数据只在其生命周期内(函数调用期间)有效
calldata:调用数据,一个特殊的只读数据位置,用来存储函数调用的参数,包括内部函数和外部函数,类似于memory,使用calldata变量的好处是,他不会将数据保存在内存里,并确保不会修改数据
总结:
状态变量的存储方式是storage
局部变量的可自己定义
公用函数(public)和外部函数(external)中函数的存储方法只能是memory,calldata
私有函数(private)和内部函数(internal)都可以
映射(mapping)只能存储在storage中,并且不能在函数内部定义,映射一般声明为状态变量
一般建议将函数参数和局部变量声明为memory
*/
//演示数据存储的用法
contract variable2{
//状态变量强制为storage
string public str;
bytes public bs;
uint[] public arr;
mapping(address =>uint) map;
struct Student{
string name;
uint score;
}
Student[] public students;
//公共函数和外部函数可以是memory和calldata
//私有函数和内部函数还可以声明成storage

//字符串的存储位置
function setString(string memory _str) public{
    str = _str;
}
//字节的存储位置
function setBytes(bytes memory _bs) public{
    bs = _bs;
}
//数组的存储位置
function setArray(uint[] memory _arr) public{
    for(uint i=0;i<_arr.length;i++){
        arr.push(_arr[i]);
    }
}
//结构体的存储位置
function  setStruct(Student calldata _student)public{
    students.push(_student);
}
//在内部函数中可以声明成storage
function getLength(uint[] storage _arr) internal view returns(uint){
    return (_arr.length);
}
//调用内部函数
function test() public view returns(uint){
return getLength(arr);
}

}

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
/*
引用类型
数组 sring byte  
结构体 struct
映射   mapping
引用类型必须指定数据的位置
存储位置
在合约中声明的变量都有一个存储位置,用于指明变量的值存储在哪里
storage
memory
calldata
storage:链上存储空间,该存储位置用于永久存储数据,只要合约存在数据就一直有效,存储的gas较高
其中:
状态变量的存储强制为storage
局部变量的可以具体声明
映射只能存储到storage中
memory:内存存储,即数据存储在内存中,数据只在其生命周期内(函数调用期间)有效
calldata:调用数据,一个特殊的只读数据位置,用来存储函数调用的参数,包括内部函数和外部函数,类似于memory,使用calldata变量的好处是,他不会将数据保存在内存里,并确保不会修改数据
总结:
状态变量的存储方式是storage
局部变量的可自己定义
公用函数(public)和外部函数(external)中函数的存储方法只能是memory,calldata
私有函数(private)和内部函数(internal)都可以
映射(mapping)只能存储在storage中,并且不能在函数内部定义,映射一般声明为状态变量
一般建议将函数参数和局部变量声明为memory
*/
//演示数据存储的用法
contract variable2{
    //状态变量强制为storage
    string public str;
    bytes public bs;
    uint[] public arr;
    mapping(address =>uint) map;
    struct Student{
        string name;
        uint score;
    }
    Student[] public students;
    //公共函数和外部函数可以是memory和calldata
    //私有函数和内部函数还可以声明成storage

    //字符串的存储位置
    function setString(string memory _str) public{
        str = _str;
    }
    //字节的存储位置
    function setBytes(bytes memory _bs) public{
        bs = _bs;
    }
    //数组的存储位置
    function setArray(uint[] memory _arr) public{
        for(uint i=0;i<_arr.length;i++){
            arr.push(_arr[i]);
        }
    }
    //结构体的存储位置
    function  setStruct(Student calldata _student)public{
        students.push(_student);
    }
    //在内部函数中可以声明成storage
    function getLength(uint[] storage _arr) internal view returns(uint){
        return (_arr.length);
    }
    //调用内部函数
    function test() public view returns(uint){
    return getLength(arr);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值