solidity中的storage和memory

Storage变量:永久存储在区块链中的变量。

Memory变量:临时变量(内存型),合约函数执行完成时,内存型变量被移除。

状态变量(函数之外声明的变量)默认为“存储”类型,永久写入区块链。

函数内部声明的变量是“内存型的”,函数执行完之后自动消失。

这些关键字主要用来处理函数内的结构体和数组。

pragma solidity^0.4.24;

contract Test {    
    struct Person {
        string name;
        uint age;
    }
 
    Person[] public persons;
    
    constructor() public {
        
    } 
    function addPerson(string _name, uint _age) private{
        //函数中声明并创建结构体需要使用memory关键字
        Person memory p = Person(_name,_age);
        persons.push(p);
    }

}

 如果数组中的结构体赋值给函数中声明的变量,使用memory修饰获得的是一个副本,也就是拷贝

    function edit(uint _id) public {
        //这里获取的是 一份拷贝,下面的修改不会影响数组里的结构体
        Person memory p = persons[_id];
        p.name = "test";
        p.age = 0;
        //执行结束后 persons[_id]里的name 和age并不会改变
    }

如果使用storage修饰变量,那么得到的是一个引用,就是p 是指向 persons[_id] 的指针。如下所示:

    function edit(uint _id) public {      
        Person storage p = persons[_id];
        //这里会改变数组里的结构体
        p.name = "test";
        p.age = 0;
        //执行结束后,persons[_id]的name和age分别变为 "test"和0
    }

你可能感兴趣的:(solidity)