[http://www.cnblogs.com/snandy/archive/2011/03/01/1967806.html](http://www.cnblogs.com/snandy/archive/2011/03/01/1967806.html)
[http://www.cnblogs.com/snandy/archive/2011/03/01/1968195.html](http://www.cnblogs.com/snandy/archive/2011/03/01/1968195.html)
[http://www.cnblogs.com/snandy/archive/2011/03/01/1967962.html](http://www.cnblogs.com/snandy/archive/2011/03/01/1967962.html)
变量是计算机对内存单元的抽象,他是编程语言最重要的概念。
一般我们队内存单元的访问限制是通过变量的六个属性完成的
变量有6个属性(或者说从6个方面去描述变量)
名字/别名,代表的是对内存单元的标识符,表示内存单元
地址/左值
值/右值
类型
作用域
生存期/生命期
1、名字/别名
名字就是内存单元的标识符
当多个名字访问的都是同一个存储地址时(或者说多个名字都 绑定/约束 于同一个存储地址),可称这些名字为 别名。使用别名有损于程序的可读性,然而却很难从一门语言中完全消除。如下
~~~
//java
public static void main(String[] args) {
String name = "Jack Ma";
String alias = name;
name = "XXX";
System.out.println(name);
System.out.println(alias);
}
//C
int main(int argc,char **argv)
{
char argch[]="I Love You";
char *pc=&argch;
char *pch=pc;
printf("%s\t%s\n",pc,pch);
*(pch+2)='A';
printf("%s\t%s\n",pc,pch);
}
~~~
可以看到两个指针指向同一块内存地址,通过指针更改一个字符,另外一个指针是不知情的。
![结果详情](https://box.kancloud.cn/2016-02-24_56cd211da46f6.jpg "")
2、地址/左值
计算机中所有的数据都是存放在存储器中的,一般把存储器中的一个字节称为一个存储单元。为了正确的访问这些存储单元,需要为每个存储单元编个号。根据编号即可准确的找到该内存单元。内存单元的编号就称为 地址 。
在许多语言中,程序中同一个 名字/标识符 可以在不同的时间,与不同的 地址 关联/绑定 。
变量的地址有时也称为变量的左值(left value),或许是因为各种语言中变量经常位于赋值语句的左边表示地址。
又或许在地址图上编号总是位于左边,值总是在右边
![或者这样](https://box.kancloud.cn/2016-02-24_56cd211db622e.jpg "")
3 值/右值
变量的值是指与这个变量相关联的存储单元的内容。可以将计算机的存储单元想象成抽象的单元,而非物理单元。
现代计算机多数以字节为单位,一个字节有八位长度。
变量的值有时也称为变量的右值(right value),因为变量常被用于赋值语句的右边(参考左值)。
4 类型
类型 决定了变量可以存储的值的范围,且定义了该类型的操作集合。
如Java中int类型占4个字节,取值范围是-2147483648~2147483647,对其可进行加减乘除及取模运算。
5 作用域
作用域是指变量的可见性问题。即决定了那些子过程和函数过程可访问该变量。
各种语言的划分也不同,如有的变量作用域分为:局部、窗体、块和全局。有的则只有局部、全局之分。
如C、C++、Java中有块级作用域,JavaScript中则没有 。
6 生存期/生命期
生存期/生命期 指的是何时创建,何时释放。生存期/生命期 与 存储绑定 密切相关。
如在Java中的一个方法中声明的一个变量,该变量在方法执行时创建,执行后释放。
~~~
int main(int argc,char **argv)
{
char argch[]="I Love You";
char *pc=&argch;
char *pch=pc;
printf("%s\t%s\n",pc,pch);
*(pch+2)='A';
printf("%s\t%s\n",pc,pch);
}
~~~
如在C中的main方法中声明的一个变量,argch[],pc,pch变量在方法执行时创建,方法执行完后释放。