在solidity中,数组分为固定长度数组和不固定长度数组,顾名思义就是在声名后的数组长度是否可以发生变化。
###固定长度数组
1 | pragma solidity >=0.4.0 <0.6.0; |
固定长度数组必须初始化元素,并且无法通过new来创建。
固定长度数组的长度length属性是不可以修改的,否则会报编译错误。
固定长度数组元素是可以修改的,但是需要通过索引操作。
固定长度数组不可以使用push方法,编译无法通过。
###不固定长度数组1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17pragma 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);
}
}不固定长度数组,可以通过new来声名,元素默认取值为数组类型的默认值。
length可以修改,如果修改的length小于原先,则数组元素从后往前被去掉。
元素可以修改
可以使用push方法,push之后数据长度加一,push方法返回的是数组的长度
###memory修饰数组1
2
3
4
5
6function modifyMemoryArr() public returns(uint){
uint8[5] memory arr2 = [1,2,3,4,5];
// arr2.push(6);
// arr2.length = 6;
return arr2.length;
}memory修饰的数组必须指定数组长度
memory修饰的数组不能使用push方法
memory修饰的数组不能修改length属性
1
2
3
4function inputArr(uint[5] arr) public{
// arr.length = 6;
// arr.push(6);
}
对于方法参数是数组类型的参数,其默认也是memory修饰的,所以也无法使用length属性和push方法
1 | function assignment() public{ |
- 固定长度数组不能赋值于memory修饰的不固定长度数组
- 不固定长度数组不能使用数组字面量进行赋值
1
2
3
4
5
6
7
8
9function 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版本验了一下是可以的。有可能是旧版本不行吧。