本章节主要详细介绍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
固定大小字节数组—>动态大小字节数组—>stringa.固定字节数组转动态字节数组如下:
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类型),实际是拷贝的引用,所以修改局部变量值时,会影响到原变量。(storage赋值给storage),初始化:Test t = Test(1,2);
注:
类型支持左值:-=;+=;*=;%=;|=;&=;^=;++;–