auto 動態存儲類型變量(函數內部變量存儲默認爲 auto型)函數
auto只用於函數內部定義,單片機在執行這個函數時爲它分配內存地址,當函數執行完畢返回後,auto變量會被銷燬,再次進入這個函數時,它的初值是不肯定的,必須對她從新進行初始化。auto變量是局部變量,只容許在定義它的函數內部使用,在函數外的其餘地方都不能使用。因爲auto變量在定義它的函數之外的任何地方都是不可見的,因此容許在這個函數之外的其餘地方或是其餘函數內部定義同名的變量,它們之間是不會發生衝突的,由於他們都有本身的區域性,在實際的代碼中通常都省略這個關鍵詞,函數的形式參數默認也是auto。spa
auto變量定義格式爲:內存
auto 數據類型 變量名;作用域
static靜態存儲類型變量編譯器
static可用於函數內部變量定義,也可用於函數外部變量定義。在函數內部,static的基本用途是容許一個變量在從新進入這個函數是可以保持原來的值,static靜態變量在程序運行期間自始至終佔用被分配的存儲地址。在函數內部用static定義的變量在函數初次運行時進行初始化工做,且只操做一次,之後每次調用函數時再也不從新賦初值而只引用上次函數調用結束時的值,若是程序代碼沒有對static變量賦初值,編譯器會自動賦值0或空字符。在函數內部使用static定義的變量時局部變量,只能在定義該變量的函數內使用該變量,推出函數後,儘管靜態局部變量還繼續存在,但不能使用它。編譯
static還有第二種含義,爲了限制全局變量或函數的做用域,全局變量或函數前加static使得函數變成靜態函數,但此處static的含義不是指定存儲類型,而是對函數的做用域侷限於本文件,其餘文件不可以使用,全部又稱內部函數。使用內部函數的好處是不一樣的人編寫的不一樣的函數時,不用擔憂本身定義的函數,是否會與其它文件中的函數產生同名衝突。使用static定義的靜態全局變量和外部全局變量的差異在於,外部全局變量能夠同時給多個文件使用,而靜態全局變量則只能給定義此變量的文件使用。對於全局變量,不管是否使用static限制(即全局變量和靜態全局變量),它們都一直佔用內存地址不釋放。變量
把局部變量改變爲靜態局部變量後改變了他的生存期,把全局變量改變爲靜態全局變量後改變了他的做用域,限制了他的適用範圍。數據類型
靜態變量定義格式爲:引用
static 數據類型 變量名;程序
extern外部變量
在全部函數以外定義的變量稱之爲全局變量,全局變量能夠在定義時賦初值,若不賦初值,則系統自動定義它們的初值爲0。有static限制的全局變量稱爲內部全局變量,無static限制的全局變量成爲外部全局變量。在代碼量大的程序中,通常會把代碼分類放到多個*.c文件中,若是要在一個C文件中使用另一個C文件中已經定義的全局變量,就必須使用extern關鍵字。
extern是變量聲明關鍵字,而非定義,是引入其餘C文件中已定義的非static全局變量,好比:「extern int a;」這裏聲明瞭一個變量a,並把這個變量的類型和變量名告訴編譯系統是編譯系統再也不爲它分配內存地址,這個a是在其餘文件已經定義而且分配了內存地址的。外部變量聲明語句的位置能夠是在引用它的函數的內部,也能夠在應用它的函數的外部。若是變量聲明在函數外部,那麼同一個C文件內的全部函數均可以使用這個外部變量;反之若是在函數內部,那麼只有這一個函數可使用該變量。
注意,extern和static自己就是對立的關鍵字,使用extern是爲了避免同文件均可使用外部某個變量。
外部變量聲明格式爲
extern 數據類型變量名;