Solidity基础(4)--类型详解(引用类型)

本章节主要详细介绍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类型),实际是拷贝的引用,所以修改局部变量值时,会影响到原变量。(storage赋值给storage),初始化:Test t = Test(1,2);

注:
类型支持左值:-=;+=;*=;%=;|=;&=;^=;++;–

猜你喜欢

转载自blog.csdn.net/qq_32090861/article/details/80937340
今日推荐