状态变量与局部变量
状态变量:保存在区块链(合约)中的变量被称为状态变量
局部变量:函数的参数,返回参数以及在函数内部定义的变量称为局部变量
值类型和引用类型
值类型:值类型传递时,会临时拷贝一份内容,而不是拷贝指针。当修改新的变量时,不会影响原来变量的值。
- 布尔(bool)
- 整型(int/uint)
- 地址(address)
- 定长字节数组(bytes1,bytes2...bytes32)
- 有理数和整数字面值常量
- 枚举类型(enum)
- 函数类型
引用类型:引用类型可以通过多个不同的名称修改它的值,这是因为新的变量同时指向同一个地址的原因。
- 不定长字节数组(bytes)
- 字符串(string)
- 数组(array)
- 结构体(struct)
引用类型的 memory 和 storage存储位置
- memory和storage的说明
- memory:表示变量存储在内存中
- storage:表示变量存储在区块链中
- 不同数据类型的变量默认的存储位置
- 状态变量总是会存储在storage 中
- 局部变量
- 函数参数和返回值默认存放在 内存memory 中
- 引用类型变量(结构、数组或映射类型)的局部变量,默认会存储在storage中
- 值类型变量(除结构、数组及映射类型之外的简单类型),会储存在memory栈中
- 案例
- memory赋值给局部变量
- storage转storage
- memory赋值给状态变量
- storage转memory
- memory转memory
pragma solidity ^0.4.17;
contract VarTest{
string public name = "init";
//memory赋值给局部变量
function memoryToLocalval(string _name) pure public returns(string){
string memory localName = _name;
return localName;
}
//storage转storage
function storageToStorage(string storage _name) internal returns(string){
string storage localName = _name;
//error
//localName = "yorick";
bytes(localName)[0] = "h";
return localName;
}
function callStorageToStorage() public returns(string){
return storageToStorage(name); //状态变量的 init 变为 hnit
}
//memory赋值给状态变量,赋值之后再更改局部变量,不会影响状态变量
function memoryToStorage(string _name) public{
name = _name;
_name = "hehe";
}
//storage转memory
function storageToMemory(string storage _name) pure internal returns(string){
string memory localName = _name;
//此处修改局部变量不会影响状态变量
localName = "hehe";
return localName;
}
function callStorageToMemory() view public returns(string){
return storageToMemory(name);
}
//memory转memory
function memoryToMemory(string _name) pure internal{
string memory localName = _name;
bytes(localName)[0] = "h";
//修改不会影响_name的值,可能是由于赋新的字符串指针执行另外的空间了
//localName = "hehe";
}
function callMemoryToMemory() pure public returns(string){
string memory localName = "yoyo";
memoryToMemory(localName);
return localName; //hoyo
}
}
网友评论