Solidity - 数组

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

您可以声明一个数组变量(例如numbers)并使用numbers[0]、numbers[1]和...、numbers[99,而不是声明单个变量(例如number0、number1、...和number99) ] 代表各个变量。 数组中的特定元素通过索引来访问。

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

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

声明数组

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

type arrayName [ arraySize ];

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

uint balance[10];

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

type[] arrayName;

初始化数组

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

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

大括号 [ ] 之间的值的数量不能大于我们为方括号 [ ] 之间的数组声明的元素数量。以下是分配数组的单个元素的示例 −

如果省略数组的大小,则会创建一个足以容纳初始化的数组。 因此,如果你写 −

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

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

balance[2] = 5;

上述语句将数组中第 3rd 号元素的值指定为 5。

创建动态内存数组

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

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

访问数组元素

通过索引数组名称来访问元素。 这是通过将元素的索引放在数组名称后面的方括号内来完成的。 例如 −

uint salary = balance[2];

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

成员

  • 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);
   }
}