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的变长数组,不支持修改length属性,来调整数组大小。memory的变长数组虽然可以通过参数灵活指定大小,但一旦创建,大小不可调整。
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;
}
}
变长的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]);
}
}
}