狀態(tài)變量和局部變量:
1,在合約中定義的變量為狀態(tài)變量穿撮,在方法中定義的變量為局部變量缺脉;
2,狀態(tài)變量都是存儲在區(qū)塊鏈中的悦穿,局部變量都是存在內(nèi)存中的攻礼,局部變量出了作用域就等待被回收。
memory和storage:
1栗柒,在合約中聲明的變量默認(rèn)是storage的
2礁扮,方法參數(shù)中的變量默認(rèn)是memory的知举,方法中定義的變量默認(rèn)是臨時storage的(其實只是storage的引用且只能是復(fù)雜類型的數(shù)據(jù)(如 string,array和struct))太伊,方法中定義的值類型變量默認(rèn)是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.如果方法參數(shù)是storage的那么該方法一定要是private的修飾的僚焦。不然會報錯
memory->memory 是值copy一份锰提。
memory->storage 是將memory的值copy一份存到storage中。
storage->storage 是引用copy一份芳悲,然后都指向同一個storage值立肘。
storage->memory是值copy一份到memory