1. 程式人生 > >026day(全域性,區域性,靜態變數和變數的作用域,生存期)

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迴圈;

同名識別符號的作用域,當大的包含小的時,在小的作用域裡,大的識別符號被遮蔽,不起作用;

       變數的生存期:在此期間,變數佔用記憶體空間,佔用的記憶體空間只能歸它使用,不會被用來存放其他東西;

全域性變數的生存期:從程式被裝入記憶體開始,到整個程式結束;

靜態區域性變數生存期:從定義它的語句第一次被執行,到整個程式結束;

函式形參的生存期:從函式執行開始,到函式返回時結束。

非靜態區域性變數:從執行到定義它的語句開始,到程式執行到它的作用域之外結束;

明日計劃:學習選擇排序和插入排序;