Solidity编程语言(7)--数组

在solidity中,数组分为固定长度数组和不固定长度数组,顾名思义就是在声名后的数组长度是否可以发生变化。

###固定长度数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pragma solidity >=0.4.0 <0.6.0;

contract EgFixedArray {
uint[5] arr1 = [1,2,3,4,5];
//uint[5] arr1 = [];
//uint[5] arr2 = new uint[](5);
function modifyLen()public{
// arr1.length = 2;编译失败
}

function modifyElement()public {
arr1[1] = 3;
}

function pushToArray() public{
// arr1.push(1);编译失败
}
}
  1. 固定长度数组必须初始化元素,并且无法通过new来创建。

  2. 固定长度数组的长度length属性是不可以修改的,否则会报编译错误。

  3. 固定长度数组元素是可以修改的,但是需要通过索引操作。

  4. 固定长度数组不可以使用push方法,编译无法通过。
    ###不固定长度数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    pragma solidity >=0.4.0 <0.6.0;

    contract EgUnFixedArray {
    //uint[] arr1 = [1,2,3,4,5];
    uint[] arr1 = new uint[](5);
    function modifyLen()public{
    arr1.length = 2;
    }

    function modifyElement()public {
    arr1[1] = 3;
    }

    function pushToArray() public {
    arr1.push(1);
    }
    }
  5. 不固定长度数组,可以通过new来声名,元素默认取值为数组类型的默认值。

  6. length可以修改,如果修改的length小于原先,则数组元素从后往前被去掉。

  7. 元素可以修改

  8. 可以使用push方法,push之后数据长度加一,push方法返回的是数组的长度
    ###memory修饰数组

    1
    2
    3
    4
    5
    6
    function modifyMemoryArr() public returns(uint){
    uint8[5] memory arr2 = [1,2,3,4,5];
    // arr2.push(6);
    // arr2.length = 6;
    return arr2.length;
    }
  9. memory修饰的数组必须指定数组长度

  10. memory修饰的数组不能使用push方法

  11. memory修饰的数组不能修改length属性

    1
    2
    3
    4
    function inputArr(uint[5] arr) public{
    // arr.length = 6;
    // arr.push(6);
    }

对于方法参数是数组类型的参数,其默认也是memory修饰的,所以也无法使用length属性和push方法

1
2
3
4
5
6
function assignment() public{
// uint[] memory x = [uint(1), 3, 4];
// uint[] x = [uint(1), 3, 4];
uint[3] memory x = [uint(1), 3, 4];
uint[] memory x1 = new uint[](3);
}
  1. 固定长度数组不能赋值于memory修饰的不固定长度数组
  2. 不固定长度数组不能使用数组字面量进行赋值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function testReturn1() public returns(uint[3] memory){
    uint[3] memory u1 = [uint(1),2,3];
    return u1;
    }

    function testReturn2() public returns(uint[] memory){
    uint[] memory u2 = new uint[](5);
    return u2;
    }

网上有看到说是返回值不能使用不固定长度数组,我使用0.5.2的solidity版本验了一下是可以的。有可能是旧版本不行吧。