一:自動變量,靜態變量和寄存器變量的定義:
根據變量存儲位置不同,變量還可以分為自動變量,靜態變量和寄存器變量
自動變量:局部沒有經過任何修飾的局部變量叫自動變量 (它存在於動態數據區——棧),這個區域內的數據隨著程序的運行動態的生成和釋放,函數返回就釋放,函數要調用就生成。關鍵字:默認是atuo(一般不寫).
自動變量的特點:當程序執行到自動變量的作用域的時候就分配,不是到了聲明代碼才分配哦!到了代碼分配就晚啦!當定義自動變量的函數執行結束後,程序將釋放該自動變量的存儲空間,留給其他自動變量使用。事例:
#include <stdio.h>void add(int n){ auto int s = 0; s = s + 1; printf("No.%d: s=%d ", n, s);}void main(){ int i = 1; for(i; i<4; i++) { add(i); }}
輸出為:
No.1: s=1
No.2: s=1
No.3: s=1
從這個例子不難看出,自動變量的初始值在每次分配存儲空間後都要重新賦值。
靜態變量:靜態變量其實也存在於數據區和全局變量是一樣的。但是靜態變量在編譯器級別有所限制(編譯器對於靜態變量的訪問做了限制(對內存空間的限制有兩種級別,一種是編譯器級別,這種訪問限制其實是編譯器在做語法檢查;第二種情況是操作系統級別,這種情況,要是你強制訪問,操作系統可能會藍屏或者報警告錯誤!))。調試證明:
這個證明:靜態變量其實也存在於數據區和全局變量是一樣的.
再看這個例子:
這裡為什麼會編譯錯誤呢!顯示x沒有定義。這當然大家都知道,但是為什麼呢?!同樣是數據區的東西為什麼訪問不了!我們再來看下下面的代碼:
這裡可以看到。0x88888888和0x12312312明明就是在一塊的,為什麼就不能訪問呢。原因看下面的圖(注意:下面是打開的.obj文件,也就是鏈接之前的那個文件):
我們把這些信息用注釋的方式寫到代碼裡看起來要好些:
我們從這裡可以清楚的看到,靜態變量被重新命名了,所以造成了無法訪問的問題。注意看重命名的規則,它集成了它所在的函數信息,變量和函數綁定了。有一定的規則!不過這個在編譯器內部規定,不同編譯器的規則是不一樣的。只要知道靜態變量的原理即可。
靜態變量生存周期:和全局變量一樣,從可執行文件被加載到程序結束(它出生比main函數早,死亡比main函數晚)。
局部靜態變量:它的存儲區還是在數據區。
全局靜態變量無法誇文件,也是編譯器級別的控制。
靜態變量的作用:實現私有。
寄存器變量:我覺得這個可以不用說了,因為我通過調試和實踐發現寄存器變量分明就是雞肋!不用管它!