標籤:
根據儲存位置不同,可以分為,靜態變數(靜態儲存區),動態變數(運行時堆棧),寄存器變數(寄存器)
靜態變數(靜態儲存區):全域變數和使用static聲明的局部變數都是靜態變數,在系統運行過程中只初始化一次。#include <stdio.h>
int a=1; //全域變數儲存在靜態記憶體中,只初始化一次void showMessage(){ static int b=1; //靜態變數儲存在靜態記憶體中,第二次調用不會再進行初始化 int c=1; ++b; a+=2; printf("a=%d,b=%d,c=%d\n",a,b,c);}int main(int argc, const char * argv[]) { showMessage(); //結果:a=3,b=2,c=1 showMessage(); //結果:a=5,b=3,c=1 return 0;}
解釋:
全域變數,範圍在自己的類裡,類實現的各處均可調用。儲存在靜態區
局部變數,範圍在一個方法裡,方法結束,變數銷毀。儲存在動態區,儲存在棧中。
自動變數;不含有static的局部變數,儲存在棧中。
static修飾的變數;靜態變數,範圍為本類(如果其他類調用該變數的同名變數,不會報錯。)修飾函數,為內建函式,外部調用會報錯。
extern修飾的變數:申明一個已經存在的變數,只是聲明,沒有初始化。extern修飾函數,是聲明和定義函數為外部函數,可以省略,所以所有的函數都預設為外部函數。
單例是全域變數,因為單例在整個程式運行期間只被建立初始化一次,因此單例只儲存一個對象,如果在A類中建立單例,那麼在B類中再次建立單例的話,單例仍然保持著A類中得對象,單例對象的各種狀態就依然儲存著A類運行之後的狀態。(比如一個播放器對象Player,是一個單例,你在A類中設定Player.playing = YES;之後跳轉到B類,再次建立Player對象,Player.playing屬性仍然是YES,不會因為重新建立而預設為nil);
重載就是重新載入,就是重新alloc。
總結
最後做一下簡單總結一下:
- extern作用於變數時用於聲明一個已經定義的變數,但是並不能定義變數;使用extern你可以在其他檔案中使用全域變數(當然此時extern可以省略);
- extern作用於函數時與它作用於全域變數有點類似,聲明這個函數是外部函數,其他檔案可以訪問,但不同的是當它作用於函數時不僅可以聲明函數還可以定義函數(用在函數定義前面),不管是定義還是聲明都可以省略,C語言預設認為函數定義或聲明都是外部函數;
- static作用於變數時,該變數只會定義一次,以後在使用時不會重新定義,當static作用於全域變數時說明該變數只能在當前檔案可以訪問,其他檔案中不能訪問;
- static作用於函數時與作用於全域變數類似,表示聲明或定義該函數是內建函式(又叫靜態函數),在該函數所在檔案外的其他檔案中無法訪問此函數;
- 參考http://www.cnblogs.com/kenshincui/p/3854243.html
ios 各種變數和作用範圍