solidity智能合约[42]-memory与storage相互转换
下面的例子说明了memory赋值给storage的情况。在test函数中,memory空间的变量s复制给了状态变量stu。为值的拷贝问题。并且由于这两个空间互不影响。因此修改变量的值不会影响到另一个变量的值。
当调用call函数时,返回100,"jonson"
。s的修改不会影响变量stu。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pragma solidity ^0.4.23;
contract MemoryTostorage{
struct student{
uint grade;
string name;
}
student stu;
function test(student memory s) internal{
stu = s;
s.name = "alice";
}
function call() returns(uint,string){
student memory guy = student(100,"jackson");
test(guy);
return (stu.grade,stu.name);
}
}
storage 赋值 memory
如下例,说明了storage复制给结构体 memory变量的情况。在test函数中,其实质是将s引用的状态变量的值赋值给了guy。
变量guy不是存储的引用,而是一个结构体空间。当调用call函数时,返回100,"jonson"
。对于guy的修改不会影响到stu的修改。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
contract storageToMemory{
struct student{
uint grade;
string name;
}
student stu = student(100,"jackson");
function test(student storage s) internal{
student memory guy = s;
guy.grade = 50;
}
function call() public returns(uint,string){
test(stu);
return (stu.grade,stu.name);
}
memory 转 memory
memory与memory之间的相互转换是值传递。
在下面的例子中,当调用call函数时,在memory中开辟了结构体的三个实例空间a、b、c。赋值为值的拷贝。他们之间互不影响。
修改一个变量不会影响其他变量的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pragma solidity ^0.4.23;
contract memoryTomemory{
struct student{
uint grade;
string name;
}
function test(student memory b) internal{
student memory c = b;
c.name = "jonson";
}
function call() returns(string){
student memory a = student(100,"olaya");
test(a);
return a.name;
}
}
本文链接:https://dreamerjonson.com/2018/11/23/solidity-42-memory-storage/
版权声明:本博客所有文章除特别声明外,均采用CC BY 4.0 CN协议许可协议。转载请注明出处!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。