// 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);
}
}