- Solidity 教程
- Solidity - 首页
- Solidity - 概述
- Solidity - 环境搭建
- Solidity - 基本语法
- Solidity - 第一个应用
- Solidity - 注释
- Solidity - 数据类型
- Solidity - 变量
- Solidity - 变量作用域
- Solidity - 运算符
- Solidity - 循环
- Solidity - 决策
- Solidity - 字符串
- Solidity - 数组
- Solidity - 枚举
- Solidity - 结构体
- Solidity - 映射
- Solidity - 类型转换
- Solidity - 以太币单位
- Solidity - 特殊变量
- Solidity - 样式指南
- Solidity 函数
- Solidity - 函数
- Solidity - 函数修饰符
- Solidity - View 函数
- Solidity - Pure 函数
- Solidity - 回退函数
- 函数重载
- 数学函数
- 加密函数
- Solidity 常用模式
- Solidity - 提款模式
- Solidity - 受限访问
- Solidity 高级
- Solidity - 合约
- Solidity - 继承
- Solidity - 构造函数
- Solidity - 抽象合约
- Solidity - 接口
- Solidity - 库
- Solidity - 汇编
- Solidity - 事件
- Solidity - 错误处理
- Solidity 有用资源
- Solidity - 快速指南
- Solidity - 有用资源
- Solidity - 讨论
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); } }