数组
数组的定义
一、定长数组
要注意定长数组的长度与内容要匹配
uint[3] memory a = [uint(1), 2, 3]; //这是正确定义
uint[3] memory a = [1, 2, 3]; //这样也不行
string[2] memory b = ["a"]; //错误的定义
二、变长数组
对于变长数组,在初始化分配空间前不可使用,可以通过new关键字来初始化一个数组。
memory:
uint[] memory memVar; //通过new初始化一个memory的变长数组 memVar = new uint[](2);
storage:
uint[] stateVar; stateVar = new uint[](2);
属性和方法
1、length属性【表示数组长度】
扫描二维码关注公众号,回复:
3510147 查看本文章
storage属性的数组:
storage属性下的数组可以通过length查询数组长度以及调整数组长度。
看下面例子:
- 先定义一个storage属性的数组stateVar,并初始化长度为1
- 在autoExendArray函数中,stateVar[stateVar.length++]=a; 对数组对应长度的元素进行赋值,同时又增加数组长度,以便下一次赋值。
pragma solidity ^0.4.0; contract AutoExtendArray{ uint[] stateVar = new uint[](1); function autoExendArray(uint a) returns (uint){ //stateVar.length++语句会修改数组的长度加1 stateVar[stateVar.length++] = a; return stateVar[stateVar.length - 1]; } }
执行结果:
第一次:
第二次:
memory属性的数组:
- 对于memory的变长数组,不支持修改length属性,来调整数组大小。
- memory的变长数组虽然可以通过参数灵活指定大小,但一旦创建,大小不可调整。
2、 push方法(仅支持storage属性和bytes数组)
可以将一个新元素附加到数组末端,返回值为当前长度。
bytes和string
- bytes和string是一种特殊的数组。
- bytes类似byte[],但在外部函数作为参数调用中,会进行压缩打包,更省空间,所以应该尽量使用bytes。
- string类似bytes,但不提供长度和按序号的访问方式。
- 由于bytes与string,可以自由转换,你可以将string s通过bytes(s)转为一个bytes。但需要注意的是通过这种方式访问到的是UTF-8编码的码流,并不是独立的一个个字符
pragma solidity ^0.4.0;
contract bytes_string{
string s='a';
function bytes_2_string() returns(bytes) {
bytes a;
a=bytes(s);
return a;
}
}
3、EVM的限制
不能通过外部函数返回变长的数据
对于这样的问题的一种临时的解决办法,是使用一个非常大的定长数组。
不过现在的版本好像是已经解决了这个问题。