引用类型(Reference Type):包括(array)和结构体(stuct),
数组(Array)是Solidity常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。数组分为固定长度数组和可变长度数组两种:
- 固定长度数组:在声明中指定数组的长度.用T[K]的格式声明,其中T是元素的类型,k是长度.
//固定长度 array
uint[8] array1;
bytes1[5] array2;
address[100] array3;
//可变长度array
uint[] array4;
bytes1[] array5;
address[] array6;
bytes array7;
bytes比较特殊,是数组,但不用加[].另外,不能用byte[]声明单字节数组,可以使用bytes或bytes1[]. bytes比bytes1[]省gas
- 对于memory修饰的动态数组,可以用new操作符创建,但必须声明长度,并且声明后不能改变.
//memory动态数组
uint[] memory array8 = new uint[](5);
bytes memory array9 = new bytes(9);
-
数组字面常数(array Literals)是写作表达式形式的数组,用[]包着来初始化array的一种方式,并且tyoe以第一个元素为准,因为在solidity中如果一个值没有指定type的话,会根据上下文推断元素的类型,默认最小单位类型是uint8
-
如果创建的是动态数组,需要一个一个元素的赋值
uint[] memory x = new uint[](3);
x[0] = 1;
x[1] = 3;
x[2] = 4;
- length: 数组有一个包含元素数量的length成员,memory数组的长度在创建后是固定的.
- push: 动态数组拥有push()成员,可以在数组最后添加一个0元素,并返回该元素的引用.
- push(x):动态数组拥有push(x)成员,可以在数组最后添加一个x元素
- pop():动态数组拥有pop(),可以移除数组最后一个元素
solidity支持通过构造结构体的形式定义新的类型.结构体中的元素可以是原始类型,也可以是引用类型;结构体可以作为数组或元素的映射.创建结构体的方法如下:
//结构体
struct Student{
uint256 id;
uint256 score;
}
Student student;//初始一个student结构体
给结构体赋值有四种方法:
- 在函数中创建一个storage的struct的引用
function fStudent_1() external {
Student storage _student = student;
_student.id = 11;
_student.score = 100;
}
- 直接引用状态变量的struct
function fStudent_2() external {
student.id = 1;
student.score = 80;
}
- 构造函数式
function fStudent_3() external {
student = Student(3,90);
}
- key value
function fStudent_4() external {
student = Student({id:4,score:60});
}