contract Person {
string public _name;
function Person() {
_name = "liyuechun";
}
function f() {
modifyName(_name);
}
/*storage(指针传递)
当函数参数为memory类型时,相当于值传递,而storage类型的函数参数将是指针传递。
如果想要在modifyName函数中通过传递过来的指针修改_name的值,那么必须将函数参数的类型显示设置为storage类型,storage类型拷贝的不是值,而是_name指针,
当调用modifyName(_name)函数时,相当于同时有_name,name,name1三个指针同时指向同一个对象,
我们可以通过三个指针中的任何一个指针修改他们共同指向的内容的值。
引用传递,改变了_name的值'Liyuechun'
function modifyName(string storage name) internal {
var name1 = name; //var直接将name的状态类型赋值给name1(string) var i=0 == uint8 i =0
bytes(name1)[0] = 'L';
}
任何函数参数当它的类型为引用类型时,这个函数参数都默认为memory类型,memory类型的变量会临时拷贝一份值存储到内存中,
当我们将这个参数值赋给一个新的变量,并尝试去修改这个新的变量的值时,最原始的变量的值并不会发生变化
值传递,_name "liyuechun" 未改变
*/
function modifyName(string memory name) public {
var name1 = name;
bytes(name1)[0] = 'L';
}
}
值类型(Value Type)
布尔(bool)
整型(integer)
地址(address)
定长字节数组(fixed byte arrays)
有理数和整型(Rational and Integer,String literals)
枚举类型(Enums)
函数(Functions Types)
值类型传递时,会临时拷贝一份内容出来,而不是拷贝指针,当你修改新的变量时,不会影响原来的变量的值
引用类型(Reference Types)
不定长字节数组(bytes)
字符串(string)
数组(Array)
结构体(Struts)
引用类型,赋值时,可以值传递,也可以引用(地址传递)
值传递: 当你修改新的变量时,不会影响原来的变量的值
引用传递: 当你修改新变量时,原来变量的值会跟着变化,这是因为新/旧变量指向同一个地址的原因。