状态变量和局部变量:
1,在合约中定义的变量为状态变量,在方法中定义的变量为局部变量;
2,状态变量都是存储在区块链中的,局部变量都是存在内存中的,局部变量出了作用域就等待被回收。
memory和storage:
1,在合约中声明的变量默认是storage的
2,方法参数中的变量默认是memory的,方法中定义的变量默认是临时storage的(其实只是storage的引用且只能是复杂类型的数据(如 string,array和struct)),方法中定义的值类型变量默认是memor的 。
例如:
contract MemeryAndStorage{
struct Anime{
string name;
uint age;
}
Anime public an = Anime("da bai",2);
function anmi(){
modifyAn(an);
}
function modifyAn(Animer storage _an) private {
Animer bn = _an;
}
}
上面 bn 就是一个storage的引用,指向an.如果方法参数是storage的那么该方法一定要是private的修饰的。不然会报错
memory->memory 是值copy一份。
memory->storage 是将memory的值copy一份存到storage中。
storage->storage 是引用copy一份,然后都指向同一个storage值。
storage->memory是值copy一份到memory