03.Solidity状态变量、局部变量与memory 、storage

memory,storange

memory,storage在Solidity开发中的作用,以及值类型、引用类型在合约中memory/storage关键字的区别

一段代码清楚认识状态变量、局部变量

pragma solidity ^0.4.4;

contract Person {

    int public _age;
    string public _name;

    function Person(int age,string name) {
          _age = age;
          _name = name;
    }


    function f(string name) {
          var name1 = name;
          ...
    }
}

在这段代码中,_age,_name就属于状态变量,Person(int age,string name)中的age和name,还有f(string name)中的name以及f()函数中声明的name1都默认属于本地/局部变量。

值类型代码演示

pragma solidity ^0.4.4;

contract Person {

    int public _age;

    function Person(int age) {
      _age = age;
    }

    function f() {
      midifyAge(_age);
    }

    function midifyAge(int age) {
      age = 100;
    }
}

应用类型 memory/storage

引用类型的变量有两种类型,分别是memory和storage

memory(值传递)

pragma solidity ^0.4.4;

contract Person {
    string public  _name;
    function Person() {
        _name = "liyuechun";
    }
    function f() {
        modifyName(_name);
    }
    function modifyName(string name)  {
        var name1 = name;
        bytes(name1)[0] = 'L';
    }
}

当引用类型作为函数参数时,它的类型默认为memory,函数参数为memory类型的变量给一个变量赋值时,这个变量的类型必须和函数参数类型一致,所以我们可以写成string memory name1 = name;,或者var name1 = name;,var声明一个变量时,这个变量的类型最终由赋给它值的类型决定
任何函数参数当它的类型为引用类型时,这个函数参数都默认为memory类型,memory类型的变量会临时拷贝一份值存储到内存中,当我们将这个参数值赋给一个新的变量,并尝试去修改这个新的变量的值时,最原始的变量的值并不会发生变化
当创建合约时,_name的值为liyuechun,当我们调用f()函数时,f()函数中会将_name的值赋给临时的memory变量name,换句话说,因为name的类型为memory,所以name和_name会分别指向不同的对象,当我们尝试去修改name指针指向的值时,_name所指向的内容不会发生变化

storage(指针传递)

当函数参数为memory类型时,相当于值传递,而storage类型的函数参数将是指针传递
如果想要在modifyName函数中通过传递过来的指针修改_name的值,那么必须将函数参数的类型显示设置为storage类型,storage类型拷贝的不是值,而是_name指针,当调用modifyName(_name)函数时,相当于同时有_name,name,name1三个指针同时指向同一个对象,我们可以通过三个指针中的任何一个指针修改他们共同指向的内容的值。

pragma solidity ^0.4.4;
contract Person {
    string public  _name;
    function Person() {
        _name = "liyuechun";
    }
    function f() {
        modifyName(_name);
    }

    function modifyName(string storage name)  {
        var name1 = name;
        bytes(name1)[0] = 'L';
    }
}
 

因为函数默认为public类型,但是当我们的函数参数如果为storage类型时,函数的类型必须为internal或者private

pragma solidity ^0.4.4;

contract Person {

    string public  _name;

    function Person() {
        _name = "liyuechun";
    }

    function f() {

        modifyName(_name);
    }

    function modifyName(string storage name) internal {

        var name1 = name;
        bytes(name1)[0] = 'L';
    }
}
 

你可能感兴趣的:(Solidity)