Solidity 引用类型
本章节主要介绍 solidity 中引用类型的属性和注意点,引用类型包括: 可变字节数组,数组,结构体。
1. 可变字节数组
- string:是一个动态尺寸的utf-8编码字符串,他其实是一个特殊的可变字节数组,同时其也是一个引用类型
bytes:动态字节数组
注: 1.string并没有提供方法获取其字符串长度,也没提供方法修改某个索引的字节码,但是可以把string转换成bytes进行相应的操作(例如:bytes(XXX).length ; bytes(XXX)[0]=a)
2.可变字节数组创建方式:bytes public a = new bytes(1);
3.清空字节数组的方式: (1)a.length = 0; (2)delete a;
4.push方法:例如 a.push(b) 往字节数组添加字节
5.字节数组与字符串之间的转换 动态大小字节数组—>string 固定大小字节数组—>动态大小字节数组—>string
a.固定字节数组转动态字节数组如下:
contract Test{ bytes4 public a = 0x54657374; function test1() constant returns(bytes){ bytes memory b = new bytes(a.length);//创建可变字节数组 for(uint i = 0;i<a.length;i++){ b[i] = a[i]; } return b; } }
b.动态字节数组转string如下:
function getString() constant returns(string){ return string(test1()); }
2. 数组
1. 固定长度数组:声明方式uint[5] T = [1,2,3,4,5];
2. 可变长度数组:
方式1. uint [] T = [1,2,3,4,5];
方式2.uint [] T = new uint[](5);
注:固定长度数组创建后不可对长度进行修改,但是可以对内容进行修改(这是与不可变字节数组之间不同点)
3. 二维数组:
uint [2][3] T = [[1,2],[3,4],[5,6]];
T.length 为 3
这点与java不同,java创建则是 [[1,2,3],[4,5,6]]
注:uint[2][] T = new uint[2][] (n); 创建新数组
注:
1.uint [] memory a = new uint;
用此方式创建数组时,若数组为成员变量, 则默认为storage类型;若为局部变量默认为memory类型,memory类型的数组长度创建后不可变。
contract T { uint[] memory b = new uint[](5);//错误,状态类型只能是storage function test(){ uint[] memory a = new uint[](5); a[5] = 8; //a.length = 6; 错误 } }
2.数组内元素类型转换(看下面列子)
contract T { function t() public { s([1,2]); } function s(uint[2] _arr) public { } }
正常看到上方代码应该没什么问题,但是注意:函数 s 中数组类型是uint256,而函数 t 中输入的数组类型是uint8, 这里需要将 uint8 转换一下s([uint(1),2]);
3. 结构体
contract T{ struct Test{ uint a; uint b; } }
将一个 struct 赋值给一个局部变量(默认是storage类型),实际是拷贝的引用,所以修改局部变量值时,会影响到原变量。
初始化:Test t = Test(1,2);
下一章:Solidity 值类型
本章节主要详细介绍solidity中值类型的属性以及注意点,包括: Boolean,Integer,Address,定长字节数组,Enums。1. Boolean类型bool: 可以取值 true和 false。对 ...