專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

關(guān)鍵字static在C語(yǔ)言里的用法

作者:啄木鳥(niǎo)   來(lái)源:啄木鳥(niǎo)   點(diǎn)擊數(shù):  更新時(shí)間:2014年06月14日   【字體:
關(guān)鍵字static在C語(yǔ)言里主要有兩個(gè)作用:
1.修飾變量
變量分為局部和全局變量,但是都存于內(nèi)存的靜態(tài)區(qū)。靜態(tài)全局變量的作用域僅局限于變量被定義的文件中,其他文件即使使用extern也沒(méi)法使用,其范圍準(zhǔn)確的說(shuō)是從定義之初開(kāi)始,到文件結(jié)尾處結(jié)束。在其前面定義的代碼行也不能使用。
靜態(tài)局部變量,在函數(shù)體里面定義的,就只能在這個(gè)函數(shù)里用了,同一個(gè)文檔中的其他函數(shù)也用不了。由于被static 修飾的變量總是存在內(nèi)存的靜態(tài)區(qū),所以即使這個(gè)函數(shù)運(yùn)行結(jié)束,這個(gè)靜態(tài)變量的值還是不會(huì)被銷毀,函數(shù)下次使用時(shí)仍然能用到這個(gè)值。

2.修飾函數(shù)
函數(shù)前加static 使得函數(shù)成為靜態(tài)函數(shù)。但此處“static”的含義不是指存儲(chǔ)方式,而是指對(duì)函數(shù)的作用域僅局限于本文件(所以又稱內(nèi)部函數(shù))。使用內(nèi)部函數(shù)的好處是:不同的人編寫(xiě)不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其它文件中的函數(shù)同名。
關(guān)鍵字static 有著不尋常的歷史。起初,在C 中引入關(guān)鍵字static 是為了表示退出一個(gè)塊后仍然存在的局部變量。隨后,static 在C 中有了第二種含義:用來(lái)表示不能被其它文件訪問(wèn)的全局變量和函數(shù)。為了避免引入新的關(guān)鍵字,所以仍使用static 關(guān)鍵字來(lái)表示這第二種含義。

對(duì)于第一個(gè)作用,我們可以用下面的列子來(lái)解釋一下:
static j;

void fun1(void)
{
   static i=0;
   i++;
}

void fun2(void)
{
   j=0;
   j++;
}

void main()
{
    for(k=0;k<10;k++)
       {
            fun1();
            fun2();
       }
}
i和j的值分別為什么?為什么?
解析:先對(duì)j分析,由j在文件開(kāi)頭定義,可知其為靜態(tài)全局變量,在fun2函數(shù)里,每次都先j = 0;先將j賦值為0,再++,最后結(jié)果自然是1。
      對(duì)于i而言,他是在fun1函數(shù)體內(nèi)定義的局部變量,但是,因?yàn)樗胹tatic修飾了,所以此定義語(yǔ)句只執(zhí)行一次。后面的循環(huán)直接都跳過(guò)此定義語(yǔ)句。因?yàn)?span>用static修飾的變量,在他的作用域內(nèi),定義語(yǔ)句就只執(zhí)行一次。所以j的結(jié)果為10.
:以上為個(gè)人學(xué)習(xí)時(shí)的一點(diǎn)筆記,路過(guò)的朋友,如果有錯(cuò)誤的話,請(qǐng)指正。≈x謝``~``
關(guān)閉窗口

相關(guān)文章