[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);
}
~~~
可以看到兩個指針指向同一塊內存地址,通過指針更改一個字符,另外一個指針是不知情的。

2、地址/左值
計算機中所有的數據都是存放在存儲器中的,一般把存儲器中的一個字節稱為一個存儲單元。為了正確的訪問這些存儲單元,需要為每個存儲單元編個號。根據編號即可準確的找到該內存單元。內存單元的編號就稱為 地址 。
在許多語言中,程序中同一個 名字/標識符 可以在不同的時間,與不同的 地址 關聯/綁定 。
變量的地址有時也稱為變量的左值(left value),或許是因為各種語言中變量經常位于賦值語句的左邊表示地址。
又或許在地址圖上編號總是位于左邊,值總是在右邊

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變量在方法執行時創建,方法執行完后釋放。