91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

solidity復雜類型Data_Location怎么運用

發布時間:2021-12-07 15:36:22 來源:億速云 閱讀:164 作者:iii 欄目:互聯網科技

這篇文章主要介紹“solidity復雜類型Data_Location怎么運用”,在日常操作中,相信很多人在solidity復雜類型Data_Location怎么運用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”solidity復雜類型Data_Location怎么運用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

簡介

對于復雜類型例如array,struct都有一個都有一個額外的注解(annotation),可能是storage,memory,calldata之一。根據上下文總是有一個默認的注解類型。但是一般可以通過storage和memory關鍵字顯示的修改。

對于函數的出參和入參一般默認的是memory類型(external 函數的入參例外是強制的calldata類型)

對于局部變量默認的是storage類型(可以通過memory修改)

對于狀態變量強制的是storage類型(不能通過memory修改)

關于Data Location

storage

會寫入區塊鏈中

memory

不會持久化(不會寫入到區塊鏈中)

calldata

不可修改,不可持久化

關于局部變量和狀態變量

pragma solidity ^0.4.18;

contract DL{
    uint [] stateVariable;//狀態變量(state variable)

    function normal(uint [] inArg) public returns(uint outArg){
        uint [] localVar;//局部變量(本地變量,local variable)
        return 0;
    }

    function cd(uint [] inArg)  external returns(uint outArg){
        return 0;
    }
}

上面代碼的stateVariable就是狀態變量,inArg就是入參,outArg就是出參

stateVariable的data location就是storage

localVar是局部變量,data location是memory

函數normal的inArg的data location是memory outArg也是memory

函數cd的inArg的data location是calldata outArg是memory

總結

強制的 data location:

  1. external 函數的入參: calldata

  2. 狀態變量:storage

默認的 data location:

  1. 一般函數的入參和出參(返回參數):memory

  2. 所有局部變量:storage

storage與memory之間的賦值

  1. public的函數的入參的data location不能是storage

function storaegPara(Person storage allen) public returns(uint8 age,string name){
    person = allen;
    return (person.age,person.name);
}

像上面這種就會出編譯錯誤。

  1. 局部變量的memory不能賦值給局部變量的storage,但是可以賦值給狀態變量的storage

pragma solidity ^0.4.18;

contract DL{
    struct Person{
        uint8 age;
        string name;
    }

    Person person = Person({age:20,name:"tim"});//狀態變量,強制storage(state variable)

    function storaegPara(Person storage allen) internal returns(uint8 age,string name){
        person = allen;
        return (person.age,person.name);
    }

    function testStoraegPara() returns(uint8 age,string name){
        Person allen = Person({age:22,name:"allen"});
        return storaegPara(allen);
    }
}

像上面的就會編譯錯誤。從前面我們知道:

Person allen = Person({age:22,name:"allen"});

等價于:

Person memory allen = Person({age:22,name:"allen"});

當調用storaegPara(allen)的時候,相當于把一個memory的局部allen變量賦值給一個storage的局部變量allen。

這是因為storage是靜態分配存儲空間的,對于storage的賦值,更像是對指針的賦值。

pragma solidity ^0.4.18;

contract DL{
    struct Person{
        uint8 age;
        string name;
    }

    Person person = Person({age:20,name:"tim"});//狀態變量,強制storage(state variable)

    function storaegPara(Person memory allen) internal returns(uint8 age,string name){
        person = allen;
        return (person.age,person.name);
    }

    function testStoraegPara() returns(uint8 age,string name){
        Person memory allen = Person({age:22,name:"allen"});
        return storaegPara(allen);
    }
}
  1. storage可以對memory進行賦值,執行的是拷貝操作。(修改新的memory變量不會影響原來storage變量)

  2. memory對memory的賦值是引用

memory和storage賦值總結

  1. 同類賦值(memory對memory,storage對storage)是引用,相當于指針不會執行數據拷貝。

  2. memory和storage相互賦值,執行的是數據拷貝,但是注意memory不能對局部storage賦值

memory和storage 數組

  1. 對于變長數組必須使用new初始化之后才能訪問

  2. new 產生的是memory類型的,不能轉換為局部的storage,所以可以看到在函數中下面的代碼是會出編譯錯誤的:

uint [] storage data = new uint[](1);
  1. 對于storage的變長數組,可以通過給length賦值調整數組長度。還可以使用后面提到的push()方法,來隱式的調整數組長度

  2. 對于memory的變長數組,不支持修改length屬性,來調整數組大小。memory的變長數組雖然可以通過參數靈活指定大小,但一旦創建,大小不可調整

到此,關于“solidity復雜類型Data_Location怎么運用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霞浦县| 和顺县| 怀安县| 东丰县| 定陶县| 嘉定区| 比如县| 华宁县| 烟台市| 武强县| 仁寿县| 巴彦县| 同心县| 肥东县| 什邡市| 大厂| 海兴县| 南雄市| 华亭县| 兰考县| 乐业县| 登封市| 乐安县| 响水县| 婺源县| 西峡县| 北海市| 济南市| 张家川| 唐山市| 乌兰县| 白银市| 宁海县| 洛浦县| 周口市| 东乡| 高要市| 固阳县| 腾冲县| 建宁县| 峨边|