Solidity的数组详解

创建一个数组

pragma solidity ^0.4.0;

contract Test {
    uint[5] arr = [0,1,2,3,4];//创建一个定长的数组
    uint[] storageArr;

    function a() public {

        uint[5] memory arr1 = [uint(0),1,2,3,4];//uint8显示的转换为uint256,否则会报类型错误。
        uint[] memory memoryArr;
        //storageArr[0] = 12;
        //memoryArr[0] = 13; //执行会报VM error: invalid opcode.,原因是数组还没有执行初始化。

        storageArr = new uint[](5);
        memoryArr = new uint[](5);

        storageArr[0] = 12;
        memoryArr[0] = 13; 
    }
}

固定的Memory数组(内存数组)

对于memory的变长数组,不支持修改length属性,来调整数组大小。memory的变长数组虽然可以通过参数灵活指定大小,但一旦创建,大小不可调整。

length属性

pragma solidity ^0.4.0;

contract Test {

    uint [] arr = [1,2,3,4,5];

    // 通过for循环计算数组内部的值的总和
    function sum()  public returns (uint) {
        uint num = 0;
        for(uint i = 0; i < arr.length; i++) {
            num = num + arr[i];
        }
        return num;
    }

}

push方法

变长的storage数组和bytes(不包括string)有一个push()方法。可以将一个新元素附加到数组最后端,返回值为当前长度。

pragma solidity ^0.4.0;

contract Test {

    uint[] arr;

    function a()  public returns (uint) {
        arr.push(1);// 初始化前调用
        arr = new uint[](1); 
        arr[0] = 0;

        uint len = arr.push(1);//先数组的最后添加一个元素1,方法返回的是数组的长度

        return len;

    }

}

memory的数组不可修改,不支持push方法。

多维数组

Solidity语言在定义多维数组的时候,是一个需要注意的地方。

uint[2][3]在大多数语言中,表示的是两行三列的数组,而Solidity切好相反,它表示的是三行两列的数组。但是访问数组的方法与其他语言一致。

pragma solidity ^0.4.4;

contract Test {

    uint[2][3] arr = [[1,2],[3,4],[5,6]];

    function arr_len()  public returns (uint) {

        return arr.length; //返回值为3
    }
}

固定的字节数组和可变的字节数组

bytes和string是一种特殊的数组。bytes类似于byte[],但在外部函数作为参数调用中,会进行压缩打包,更省空间,所以应该尽量使用bytes而不是byte[].
bytes0~bytes32 表示创建固定字节大小的数组,不可修改。
string是特殊的可变字节数组。可以转换为bytes以通过length获得它的字节长度。也可以通过索引来修改对应的字节内容,通过push方法来增加字节内容。

pragma solidity ^0.4.0;


contract Test {
    // 声明一个固定长度的数组,不可修改
    bytes9 a = 0x6c697975656368756e;
    byte[9] b = [byte(0x6c),0x69,0x79,0x75,0x65,0x63,0x68,0x75,0x6e];

    byte[] c = new byte[](10);

    // function setAIndex0Byte() public {
    //     // 错误,不可修改
    //     a[0] = 0x89;
    // }

    function setBIndex0Byte() public {

        b[0] = 0x89;
    }

    function setC() public {

        for(uint i = 0; i < b.length; i++) {

            c.push(b[i]);
            c.push(b[i]);
        }
    }

}

猜你喜欢

转载自blog.csdn.net/qq_33764491/article/details/80394739