機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
C語言初學(xué)者入門講座 第十講 函數(shù)(5)
C語言初學(xué)者入門講座 第十講 函數(shù)(5)
 更新時間:2008-7-27 16:04:51  點擊數(shù):2
【字體: 字體顏色
三、靜態(tài)變量

  靜態(tài)變量的類型說明符是static。 靜態(tài)變量當(dāng)然是屬于靜態(tài)存儲方式,但是屬于靜態(tài)存儲方式的量不一定就是靜態(tài)變量, 例如外部變量雖屬于靜態(tài)存儲方式,但不一定是靜態(tài)變量,必須由 static加以定義后才能成為靜態(tài)外部變量,或稱靜態(tài)全局變量。 對于自動變量,前面已經(jīng)介紹它屬于動態(tài)存儲方式。 但是也可以用static定義它為靜態(tài)自動變量,或稱靜態(tài)局部變量,從而成為靜態(tài)存儲方式。
由此看來, 一個變量可由static進行再說明,并改變其原有的存儲方式。

  1. 靜態(tài)局部變量

  在局部變量的說明前再加上static說明符就構(gòu)成靜態(tài)局部變量。

  例如:

static int a,b;
static float array[5]={1,2,3,4,5};

 
  靜態(tài)局部變量屬于靜態(tài)存儲方式,它具有以下特點:

  (1)靜態(tài)局部變量在函數(shù)內(nèi)定義,但不象自動變量那樣,當(dāng)調(diào)用時就存在,退出函數(shù)時就消失。靜態(tài)局部變量始終存在著,也就是說它的生存期為整個源程序。

  (2)靜態(tài)局部變量的生存期雖然為整個源程序,但是其作用域仍與自動變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。

  (3)允許對構(gòu)造類靜態(tài)局部量賦初值。在數(shù)組一章中,介紹數(shù)組初始化時已作過說明。若未賦以初值,則由系統(tǒng)自動賦以0值。

  (4)對基本類型的靜態(tài)局部變量若在說明時未賦以初值,則系統(tǒng)自動賦予0值。而對自動變量不賦初值,則其值是不定的。 根據(jù)靜態(tài)局部變量的特點, 可以看出它是一種生存期為整個源程序的量。雖然離開定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時,它又可繼續(xù)使用, 而且保存了前次被調(diào)用后留下的值。 因此,當(dāng)多次調(diào)用一個函數(shù)且要求在調(diào)用之間保留某些變量的值時,可考慮采用靜態(tài)局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用,因此仍以采用局部靜態(tài)變量為宜。

  [例5.15]

main()
{
int i;
void f(); /*函數(shù)說明*/
for(i=1;i<=5;i++)
f(); /*函數(shù)調(diào)用*/
}
void f() /*函數(shù)定義*/
{
auto int j=0;
++j;
printf("%d\n",j);
}

  程序中定義了函數(shù)f,其中的變量j 說明為自動變量并賦予初始值為0。當(dāng)main中多次調(diào)用f時,j均賦初值為0,故每次輸出值均為1,F(xiàn)在把j改為靜態(tài)局部變量,程序如下:

main()
{
int i;
void f();
for (i=1;i<=5;i++)
f();
}
void f()
{
static int j=0;
++j;
printf("%d\n",j);
}
void f()
{
static int j=0;
++j;
printf("%d/n",j);
}

  由于j為靜態(tài)變量,能在每次調(diào)用后保留其值并在下一次調(diào)用時繼續(xù)使用,所以輸出值成為累加的結(jié)果。讀者可自行分析其執(zhí)行過程。

  2.靜態(tài)全局變量

  全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲方式。 這兩者在存儲方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個源程序, 當(dāng)一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用, 因此可以避免在其它源文件中引起錯誤。從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。因此static 這個說明符在不同的地方所起的作用是不同的。應(yīng)予以注意。

  四、寄存器變量

  上述各類變量都存放在存儲器內(nèi), 因此當(dāng)對一個變量頻繁讀寫時,必須要反復(fù)訪問內(nèi)存儲器,從而花費大量的存取時間。 為此,C語言提供了另一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內(nèi)存,而直接從寄存器中讀寫, 這樣可提高效率。寄存器變量的說明符是register。 對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量。

  [例5.16]

求∑200i=1imain()

{
register i,s=0;
for(i=1;i<=200;i++)
s=s+i;
printf("s=%d\n",s);
}

  本程序循環(huán)200次,i和s都將頻繁使用,因此可定義為寄存器變量。對寄存器變量還要說明以下幾點:

  1. 只有局部自動變量和形式參數(shù)才可以定義為寄存器變量。因為寄存器變量屬于動態(tài)存儲方式。凡需要采用靜態(tài)存儲方式的量不能定義為寄存器變量。

  2. 在Turbo C,MS C等微機上使用的C語言中, 實際上是把寄存器變量當(dāng)成自動變量處理的。因此速度并不能提高。 而在程序中允許使用寄存器變量只是為了與標(biāo)準(zhǔn)C保持一致。3. 即使能真正使用寄存器變量的機器,由于CPU 中寄存器的個數(shù)是有限的,因此使用寄存器變量的個數(shù)也是有限的。

  三、靜態(tài)變量

  靜態(tài)變量的類型說明符是static。 靜態(tài)變量當(dāng)然是屬于靜態(tài)存儲方式,但是屬于靜態(tài)存儲方式的量不一定就是靜態(tài)變量, 例如外部變量雖屬于靜態(tài)存儲方式,但不一定是靜態(tài)變量,必須由 static加以定義后才能成為靜態(tài)外部變量,或稱靜態(tài)全局變量。 對于自動變量,前面已經(jīng)介紹它屬于動態(tài)存儲方式。 但是也可以用static定義它為靜態(tài)自動變量,或稱靜態(tài)局部變量,從而成為靜態(tài)存儲方式。
由此看來, 一個變量可由static進行再說明,并改變其原有的存儲方式。

  1. 靜態(tài)局部變量

  在局部變量的說明前再加上static說明符就構(gòu)成靜態(tài)局部變量。

  例如:

static int a,b;
static float array[5]={1,2,3,4,5};

 
  靜態(tài)局部變量屬于靜態(tài)存儲方式,它具有以下特點:

  (1)靜態(tài)局部變量在函數(shù)內(nèi)定義,但不象自動變量那樣,當(dāng)調(diào)用時就存在,退出函數(shù)時就消失。靜態(tài)局部變量始終存在著,也就是說它的生存期為整個源程序。

  (2)靜態(tài)局部變量的生存期雖然為整個源程序,但是其作用域仍與自動變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。

  (3)允許對構(gòu)造類靜態(tài)局部量賦初值。在數(shù)組一章中,介紹數(shù)組初始化時已作過說明。若未賦以初值,則由系統(tǒng)自動賦以0值。

  (4)對基本類型的靜態(tài)局部變量若在說明時未賦以初值,則系統(tǒng)自動賦予0值。而對自動變量不賦初值,則其值是不定的。 根據(jù)靜態(tài)局部變量的特點, 可以看出它是一種生存期為整個源程序的量。雖然離開定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時,它又可繼續(xù)使用, 而且保存了前次被調(diào)用后留下的值。 因此,當(dāng)多次調(diào)用一個函數(shù)且要求在調(diào)用之間保留某些變量的值時,可考慮采用靜態(tài)局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用,因此仍以采用局部靜態(tài)變量為宜。

  [例5.15]

main()
{
int i;
void f(); /*函數(shù)說明*/
for(i=1;i<=5;i++)
f(); /*函數(shù)調(diào)用*/
}
void f() /*函數(shù)定義*/
{
auto int j=0;
++j;
printf("%d\n",j);
}

  程序中定義了函數(shù)f,其中的變量j 說明為自動變量并賦予初始值為0。當(dāng)main中多次調(diào)用f時,j均賦初值為0,故每次輸出值均為1,F(xiàn)在把j改為靜態(tài)局部變量,程序如下:

main()
{
int i;
void f();
for (i=1;i<=5;i++)
f();
}
void f()
{
static int j=0;
++j;
printf("%d\n",j);
}
void f()
{
static int j=0;
++j;
printf("%d/n",j);
}

  由于j為靜態(tài)變量,能在每次調(diào)用后保留其值并在下一次調(diào)用時繼續(xù)使用,所以輸出值成為累加的結(jié)果。讀者可自行分析其執(zhí)行過程。

  2.靜態(tài)全局變量

  全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲方式。 這兩者在存儲方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個源程序, 當(dāng)一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用, 因此可以避免在其它源文件中引起錯誤。從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。因此static 這個說明符在不同的地方所起的作用是不同的。應(yīng)予以注意。

  四、寄存器變量

  上述各類變量都存放在存儲器內(nèi), 因此當(dāng)對一個變量頻繁讀寫時,必須要反復(fù)訪問內(nèi)存儲器,從而花費大量的存取時間。 為此,C語言提供了另一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內(nèi)存,而直接從寄存器中讀寫, 這樣可提高效率。寄存器變量的說明符是register。 對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量。

  [例5.16]

求∑200i=1imain()

{
register i,s=0;
for(i=1;i<=200;i++)
s=s+i;
printf("s=%d\n",s);
}

  本程序循環(huán)200次,i和s都將頻繁使用,因此可定義為寄存器變量。對寄存器變量還要說明以下幾點:

  1. 只有局部自動變量和形式參數(shù)才可以定義為寄存器變量。因為寄存器變量屬于動態(tài)存儲方式。凡需要采用靜態(tài)存儲方式的量不能定義為寄存器變量。

  2. 在Turbo C,MS C等微機上使用的C語言中, 實際上是把寄存器變量當(dāng)成自動變量處理的。因此速度并不能提高。 而在程序中允許使用寄存器變量只是為了與標(biāo)準(zhǔn)C保持一致。3. 即使能真正使用寄存器變量的機器,由于CPU 中寄存器的個數(shù)是有限的,因此使用寄存器變量的個數(shù)也是有限的。
  • 上一篇: C51單片機編程知識
  • 下一篇: C語言初學(xué)者入門講座 第十講 函數(shù)(4)
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設(shè)備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責(zé)信息內(nèi)容的真實性、準(zhǔn)確性和合法性。
    機電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1