026day(全域性,區域性,靜態變數和變數的作用域,生存期)
172210704111-陳國佳總結《2017年11月5日》【連續026天】
標題:全域性,區域性,靜態變數和變數的作用域,生存期;
內容:A.觀看MOOC10.2,10.3;
B(a).區域性變數:定義在函式內部的變數(包括函式的形參),全域性變數:定義在函式外面的變數
全域性變數在所有函式中均可使用,區域性變數只能在定義它的函式內部使用;
全域性變數都是靜態變數。定義區域性變數時,加“static”,該變數也成為靜態變數;
靜態變數的存放地址,在整個程式執行期間,都是固定不變的;
非靜態變數(一定是區域性變數)地址,在函式的一次執行期間不變,每次函式呼叫時都可能不同;
未明確初始化時,靜態變數會被自動初始化成全0(每個bit都為0),非靜態變數的值隨機;
void Func()
{
static int n = 4;
//靜態變數只初始化一次
cout<<n<<endl;
++n;
}
int main()
{
Func();Func();Func();
因為靜態變數只輸出一次,所以當第一次所以Func函式定義n後,以後的Func將不在定義n;
靜態變數應用:
strtok的實現(strtok函式詳見023day)
char *Strtok(char*p,char*sep)
{
static char*start; //本次查詢子串的起點
if(p) //如果p不為空指標,則是第一次呼叫Strtok ,故後續呼叫Strtok第一個實參必須是NULL
start=p;
for(;*start&&strchr(sep,*start);++start);
if(*start==0)
return NULL;
char *q=start;
for(;*start&&!strchr(sep,*start);++start);
if(*start){
*start=0;
++start;
}
return q;
}
(b).識別符號的作用域;變數名,函式名,型別名統稱為“識別符號”,一個識別符號能起作用的範圍叫作用域;
使用識別符號的語句,必須出現在它們的宣告或定義之後,且在作用域外使用該識別符號,該識別符號會沒有定義;
單檔案的程式中,結構,函式和全域性變數的作用域是其定義的整個檔案;
函式形參的作用域是整個函式;區域性變數的作用域是從定義它的語句開始,到包含它的最內層”}“結束;
for迴圈裡定義的迴圈控制變數,其作用域就是整個for迴圈;
同名識別符號的作用域,當大的包含小的時,在小的作用域裡,大的識別符號被遮蔽,不起作用;
變數的生存期:在此期間,變數佔用記憶體空間,佔用的記憶體空間只能歸它使用,不會被用來存放其他東西;
全域性變數的生存期:從程式被裝入記憶體開始,到整個程式結束;
靜態區域性變數生存期:從定義它的語句第一次被執行,到整個程式結束;
函式形參的生存期:從函式執行開始,到函式返回時結束。
非靜態區域性變數:從執行到定義它的語句開始,到程式執行到它的作用域之外結束;
明日計劃:學習選擇排序和插入排序;