不想说话,自闭中..

Solidity数组详解

创建一个数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()方法。可以将一个新元素附加到数组最后端,返回值为当前长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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切好相反,它表示的是三行两列的数组。但是访问数组的方法与其他语言一致。

1
2
3
4
5
6
7
8
9
10
11
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方法来增加字节内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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]);
}
}

}