Solidity - 数组



数组是一种数据结构,它存储固定大小的相同类型元素的顺序集合。数组用于存储数据集合,但通常将其视为相同类型变量的集合更有用。

无需声明单个变量,例如 number0、number1……和 number99,而是声明一个数组变量,例如 numbers,并使用 numbers[0]、numbers[1]……和 numbers[99] 来表示单个变量。数组中的特定元素通过索引访问。

在 Solidity 中,数组可以是编译时固定大小的,也可以是动态大小的。对于存储数组,它也可以具有不同类型的元素。对于内存数组,元素类型不能是映射,如果要将其用作函数参数,则元素类型应为 ABI 类型。

所有数组都由连续的内存位置组成。最低地址对应于第一个元素,最高地址对应于最后一个元素。

声明数组

要在 Solidity 中声明固定大小的数组,程序员需要指定元素的类型和数组所需的元素数量,如下所示:

type arrayName [ arraySize ];

这称为一维数组。**arraySize** 必须是大于零的整数常量,**type** 可以是任何有效的 Solidity 数据类型。例如,要声明一个名为 balance 的 10 元素 uint 类型数组,可以使用以下语句:

uint balance[10];

要在 Solidity 中声明动态大小的数组,程序员需要指定元素的类型,如下所示:

type[] arrayName;

初始化数组

您可以逐个初始化 Solidity 数组元素,或者使用单个语句,如下所示:

uint balance[3] = [1, 2, 3];

花括号 [ ] 中的值的数量不能大于我们在方括号 [ ] 中为数组声明的元素数量。以下是如何赋值数组单个元素的示例:

如果您省略数组的大小,则会创建一个刚好足以容纳初始化数据的数组。因此,如果您编写:

uint balance[] = [1, 2, 3];

您将创建与前一个示例中完全相同的数组。

balance[2] = 5;

上面的语句将数组中第 3 个元素的值赋值为 5。

创建动态内存数组

动态内存数组使用 new 关键字创建。

uint size = 3;
uint balance[] = new uint[](size);

访问数组元素

通过索引数组名称来访问元素。这是通过在数组名称之后方括号中放置元素的索引来完成的。例如:

uint salary = balance[2];

上面的语句将从数组中获取第 3 个元素并将值赋给 salary 变量。以下是一个示例,它将使用上述三个概念,即声明、赋值和访问数组:

成员

  • **length** - length 返回数组的大小。length 可用于通过设置它来更改动态数组的大小。

  • **push** - push 允许将元素追加到动态存储数组的末尾。它返回数组的新长度。

示例

尝试以下代码来了解数组在 Solidity 中的工作方式。

pragma solidity ^0.5.0;

contract test {
   function testArray() public pure{
      uint len = 7; 
      
      //dynamic array
      uint[] memory a = new uint[](7);
      
      //bytes is same as byte[]
      bytes memory b = new bytes(len);
      
      assert(a.length == 7);
      assert(b.length == len);
      
      //access array variable
      a[6] = 8;
      
      //test array variable
      assert(a[6] == 8);
      
      //static array
      uint[3] memory c = [uint(1) , 2, 3];
      assert(c.length == 3);
   }
}
广告