變量的生命週期與作用域


作用域和生存週期是完全不同的兩個概念。作用域可以看作是變量的一個有效範圍,就像網遊中的攻擊範圍一樣;生存週期可以看成是一個變量能存在多久,能在那些時段存在,就像網遊中的魔法持續時間……簡單的以一個局部變量來舉個例子:在main函數中聲明瞭變量a,那麼a的作用域就是main函數內部,脫離了main函數,a就無法使用了,main函數之外的函數或者方法,都無法去使用a。那麼a的生存週期是指a在那些時候存在,具體到這個例子,a什麼時候存在,要取決於main函數,或者說,main函數只要被調用,且調用沒有完成,那麼a就將存在。除此以外的情況,a都將被釋放。生存週期也可以理解爲從聲明到釋放的之間的時間。變量具體可以分爲全局變量、靜態全局變量、靜態局部變量和局部變量。 按存儲區域分:全局變量、靜態全局變量和靜態局部變量都存放在內存的全局數據區,局部變量存放在內存的棧區 按作用域分:全局變量在整個工程文件內都有效;靜態全局變量只在定義它的文件內有效;靜態局部變量只在定義它的函數內有效,只是程序僅分配一次內存,函數返回後,該變量不會消失;局部變量在定義它的函數內有效,但是函數返回後失效。 全局變量和靜態變量如果沒有手工初始化,則由編譯器初始化爲0。局部變量的值不可知。

總的分爲局部變量和全局變量:局部變量又可分爲動態局部變量(沒特殊聲明的變量一般都爲動態局部變量)和靜態局部變量(用static關鍵字聲明的變量如:static int a;;兩者的區別在於:靜態的局部變量生存期比動態的局部變量來的長,動態的局部變量的生存期爲所定義的範圍內,如在函數內定義的,函數結束,變量也跟着結束,變量的值不會保存下來。而靜態變量的生存期爲整個源程序(也可說是一個文件,不同環境不同稱呼)。而兩者的作用域是一樣。只能在定義他的函數內起作用,離開了這個函數就不起作用了。全局變量:在函數之外定義的變量稱爲全局變量。全局變量可以爲本文件中其他函所共用(作用域),它的有效範圍(生存期)從定義變量開始到文件結束。如果在同一個源文件中,外部變量與局部變量同名,則在局部變量的作用範圍內,外部變量被“屏蔽”,即全局變量不起作用。下面來看一個例子:#include"stdio.h"int d=1;     //聲明一個全局變量int fun(int p)     {     static int d=5;   //定義一個靜態局部變量  d初值爲5  //第二次調用時沒有執行此行   d=d+p;            //此時局部變量d的值爲9,(第一次調用)   //第二次調用是局部變量的值爲13,因爲上一次執行完後d的值爲9,   printf("%d",d);   //第一次輸出爲9//第二次輸出13}void main(){    int a=3;   d=d+a;          //此時d的值爲4;a變量的值爲3,全局變量d的值爲1。   for(i=0;i<2;i++)    fun(d);            //此處的d值爲4,傳送給形參p,再一次調用時還是將4傳給開參p  printf("d=%d",d);   //輸出d的值爲4.此處的d爲全局變量。}  看以上內容時,你先把程序看一篇,然後把會值代進去遠算,每一次看註釋時在同一行中只要看到第二個”//“時結束.2個“//”爲第二次調用時看的。以上內容有一點亂,但是希望可以幫助到你...88有什麼不明白可以再問!答案補充 

看程序時註釋行不要選先看。本程序一共調用fun函數兩次,兩次實參的值都爲4.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章