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。对 ...