数据存储
每种复杂类型(即数组和结构)都有一个额外的注释,即“数据位置”,它是存储在memory还是storage中。 根据上下文,总是有一个默认值,但可以通过将存储或内存添加到该类型来覆盖它。 最后一种数据位置比较特殊,一般只有外部函数的参数(不包括返回参数)被强制指定为calldata。这种数据位置是只读的,不会持久化到区块链。一般我们可以选择指定的是memory和storage。
数据位置很重要,因为它们会改变分配的行为方式:storage和memory之间的分配以及状态变量(甚至来自其他状态变量)的分配始终会创建独立存储空间。 另一方面,从内存存储引用类型到另一个内存存储引用类型的分配不会创建存储空间。
状态变量、局部变量
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;
}
function modifyAge(int age) {
age = 100;
}
}
- _age,_name就属于状态变量
- Person(int age,string name)中的age和name,还有f(string name)中的name以及f()方法中声明的name1都默认属于本地/局部变量。
因为_age是值类型,所以在方法传参或者将值类型的变量值赋值给一个新变量,当尝试修改新变量时,原来的值类型变量值并不会发生任何变化,在本例中,当调用modifyAge(_age)代码时,创建了一个临时变量age,并且将_age的值传给了age,因为是值传递,在modifyAge函数中修改新变量age的值时,原来的变量值_age的值保持不变。