storage和memory

memory:使用的是值传递,默认使用的是memory,传递的是值

storage:引用传递,传过来的是指针,后面一定要加上internal,private

pragma   solidity  ^0.4.4;
contract Person {
  string   _name;

  //一个构造函数
  function Person(string  name) {
    _name=name;
  }

  function f() {
    modify(_name)
  }

  //如果是storage的话,指针传递,后面要加internal,或者是private类型,不能是public的类型,而且传进来的name长度是固定,不能直接给她赋值,可以修改这个name的某个值[0],[1]等吗
  //传进来的是指针name,下面修改的话是可以修改name的值的
  //我们传过来的形参默认是memory类型,这个memory类型分相当于是值传递,如果使用storage的话,相当于是使用的指针,指针的话是可以改变这个_name的值,并且执行name方法的时候,是可以看到这个_name改变之后的值
  function modify(string   storage  name) internal{
    bytes(name)[0]='L'//传过来的第0个修改成大写,只能修改这个值的某个,不能全部比如name="yunxin"是不可以的

  }

  //当执行f方法之前的话,如果传进的参会时是Li,执行f函数之后调用这个方法,那么这个首字母大写
  //那么之后的值是li,在调用name就可以返回这个值出来
  function   name() constant  returns (string) {
      return   _name;
  }
}


//当使用的是storage的时候,传进来的是name这个指针,而不是这个值

memory就是值传递,如果形参是memory的时候,它是传递,不会修改原来的值,默认使用的是memory

如果是storage类型的话,函数只能是internal,private,修改原来传过来的值,bytes(name)[1]='L'
storage:如果使用这个的话,这所在的方法(function)在外部是看不见的,通过另一个函数才可以调用,引用传递

pragma  solidity  ^0.4.13;

contract  Test{
    string  public  _name;
    
    function  set(string   name) public{
        _name=name;
    }
    function  set1(string  a){
        modify(a);
    }

    function modify(string  b) internal{
        _name=b;//修改_name整个值,修改完之后调用get方法,_name,就会是修改好的值了
     
    }
    function  get()constant public returns(string){
        return  _name;
    }
    
}

猜你喜欢

转载自www.cnblogs.com/yunxintryyoubest/p/10663412.html