最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c語言中static的用法詳細(xì)示例分析

 更新時(shí)間:2013年08月13日 10:32:27   作者:  
以下是對c語言中static函數(shù)的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下

static在c里面可以用來修飾變量,也可以用來修飾函數(shù)。
先看用來修飾變量的時(shí)候。變量在c里面可分為存在全局?jǐn)?shù)據(jù)區(qū)、棧和堆里。其實(shí)我們平時(shí)所說的堆棧是棧而不是堆,不要弄混。

復(fù)制代碼 代碼如下:

int a ;
int main()
{
    int b ;
    int c* = (int *)malloc(sizeof(int));
}

a是全局變量,b是棧變量,c是堆變量。
static對全局變量的修飾,可以認(rèn)為是限制了只能是本文件引用此變量。有的程序是由好多.c文件構(gòu)成。彼此可以互相引用變量,但加入static修飾之后,只能被本文件中函數(shù)引用此變量。

static對棧變量的修飾,可以認(rèn)為棧變量的生命周期延長到程序執(zhí)行結(jié)束時(shí)。一般來說,棧變量的生命周期由OS管理,在退棧的過程中,棧變量的生命也就結(jié)束了。但加入static修飾之后,變量已經(jīng)不再存儲在棧中,而是和全局變量一起存儲。同時(shí),離開定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時(shí),它又可繼續(xù)使用, 而且保存了前次被調(diào)用后留下的值。

static對函數(shù)的修飾與對全局變量的修飾相似,只能被本文件中的函數(shù)調(diào)用,而不能被同一程序其它文件中的函數(shù)調(diào)用。

文件a.c

復(fù)制代碼 代碼如下:

static int i; //只在a文件中用
int j;          //在工程里用
static void init()         //只在a文件中用
{
}
void callme()          //在工程中用
{
    static int sum;
}

上面的全局i變量和init()函數(shù)只能用在a.c文件中,全局變量sum的作用域只在callme里。變量j和函數(shù)callme()的全局限擴(kuò)充到整個(gè)工程文件。所以可以在下面的b.c中用extern關(guān)鍵字調(diào)用。extern告訴編譯器這個(gè)變量或者函數(shù)在其他文件里已經(jīng)被定義了。

文件b.c

復(fù)制代碼 代碼如下:

extern int j;                    //調(diào)用a文件里的
extern void callme();   //調(diào)用a文件里的
int main()
{
  ...
}

extern的另外用法是當(dāng)C和C++混合編程時(shí)如果c++調(diào)用的是c源文件定義的函數(shù)或者變量,那么要加extern來告訴編譯器用c方式命名函數(shù):

文件A.cpp調(diào)用a.c里面的變量i和函數(shù)callme()

復(fù)制代碼 代碼如下:

extern "C"  //在c++文件里調(diào)用c文件中的變量
{
   int j;
   void callme();
}
int main()
{
   callme();
}

二 static法則:
A、若全局變量僅在單個(gè)C文件中訪問,則可以將這個(gè)變量修改為靜態(tài)全局變量,以降低模塊間的耦合度;
B、若全局變量僅由單個(gè)函數(shù)訪問,則可以將這個(gè)變量改為該函數(shù)的靜態(tài)局部變量,以降低模塊間的耦合度;
C、設(shè)計(jì)和使用訪問動態(tài)全局變量、靜態(tài)全局變量、靜態(tài)局部變量的函數(shù)時(shí),需要考慮重入問題;

全局變量有外部、靜態(tài)兩種存儲方式。
(1)全局變量一般用外部存儲方式存儲,用保留字extern加以定義。此時(shí),變量的作用域是構(gòu)成整個(gè)程序的所有程序文件,也就是定義的外部變量可供其它程序文件使用。
使用這樣的全局變量一定要非常慎重,一旦產(chǎn)生錯(cuò)誤,將波及整個(gè)程序。

(2)如果希望全局變量僅限于本程序文件使用,而其它程序文件中不能引用,這時(shí)必須將其存儲方式定義為靜態(tài)存儲方式,用保留字static加以定義。此時(shí)稱為靜態(tài)外部變量。
例如,在上例文件filel.c中,如果作這樣的定義:
static int a:
則變量a的作用域被縮小至本程序文件filel.c,文件file2.c中不能引用。
值得注意的是對全局變量加static,定義為靜態(tài)存儲方式,并不意味著是靜態(tài)存儲;而不加static,是動態(tài)存儲。兩種形式的全局變量(外部變量)都是靜態(tài)存儲方式,都是編譯時(shí)分配存儲空間,但作用域不同。使用靜態(tài)外部變量,有利于隔離錯(cuò)誤,有利于模塊化程序設(shè)計(jì)。

(3)全局變量的缺省存儲方式是外部存儲方式。
前面章節(jié)中的程序沒有見到變量的存儲類別定義,實(shí)際上采用變量的缺省存儲方式。對局部變量采用auto方式,對全局變量采用extern方式。這也是至今為止,我們在程序中沒有見到auto、extern等的原因。
至此,我們對變量的存儲類別及數(shù)據(jù)類型進(jìn)行了全面討論,在此作個(gè)小結(jié)。

1.變量定義的一般形式
存儲類別數(shù)據(jù)類型變量表;

2.變量定義的作用
①規(guī)定了變量的取值范圍。
②規(guī)定了變量進(jìn)行的運(yùn)行操作。
③規(guī)定了變量的作用域。
④規(guī)定了變量的存儲方式。
⑤規(guī)定了變量占用的存儲空間。

3.局部變量和全局變量
從作用域角度將變量分為局部變量和全局變量。它們采取的存儲類別如下:

局部變量:
①自動變量,即動態(tài)局部變量(離開函數(shù),值就消失)。
②靜態(tài)局部變量(離開函數(shù),值仍保留)。
③寄存器變量(離開函數(shù),值就消失)。
④形式參數(shù)可以定義為自動變量或寄存器變量。

全局變量:
①靜態(tài)外部變量(只限本程序文件使用)。
②外部變量(即非靜態(tài)的外部變量,允許其它程序文件引用)。

4.動態(tài)存儲和靜態(tài)存儲
從變量存在時(shí)間可將變量存儲分為動態(tài)存儲和靜態(tài)存儲。靜態(tài)存儲是在整個(gè)程序運(yùn)行時(shí)都存在,而動態(tài)存儲則是在調(diào)用函數(shù)時(shí)臨時(shí)分配存儲單元。

動態(tài)存儲:
①自動變量(函數(shù)內(nèi)有效)。
②寄存器變量(函數(shù)內(nèi)有效)。
③形式參數(shù)。

靜態(tài)存儲:
①靜態(tài)局部變量(函數(shù)內(nèi)有效)。
②靜態(tài)外部變量(本程序文件內(nèi)有效)。
③外部變量(整個(gè)程序可引用)。

5.靜態(tài)存儲區(qū)和動態(tài)存儲區(qū)
從變量值存放的位置可將變量存儲區(qū)分為靜態(tài)存儲區(qū)和動態(tài)存儲區(qū):
內(nèi)存中靜態(tài)存儲區(qū):
①靜態(tài)局部變量。
②靜態(tài)外部變量。
③外部變量(可被同一程序其它文件引用)。
內(nèi)存中動態(tài)存儲區(qū):自動變量和形式參數(shù)。
CPU中的寄存器:寄存器變量。

相關(guān)文章

  • C語言實(shí)現(xiàn)鏈表貪吃蛇

    C語言實(shí)現(xiàn)鏈表貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)鏈表貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Qt掃盲篇之QRegExp正則匹配類總結(jié)

    Qt掃盲篇之QRegExp正則匹配類總結(jié)

    這篇文章主要給大家介紹了關(guān)于Qt掃盲篇之QRegExp正則匹配類總結(jié)的相關(guān)資料,QRegExp是Qt框架中的一個(gè)類,用于進(jìn)行正則表達(dá)式的匹配和處理,它提供了多種模式來匹配不同的字符串,需要的朋友可以參考下
    2023-12-12
  • C++自定義函數(shù)判斷某年某月某日是這一年中第幾天

    C++自定義函數(shù)判斷某年某月某日是這一年中第幾天

    這篇文章主要介紹了C++自定義函數(shù)判斷某年某月某日是這一年中第幾天的方法,涉及C++日期與時(shí)間操作相關(guān)技巧,需要的朋友可以參考下
    2016-06-06
  • 用C語言進(jìn)行最基本的socket編程

    用C語言進(jìn)行最基本的socket編程

    這篇文章主要介紹了C語言下socket編程的基本知識講解,包括最基本的客戶端發(fā)送及服務(wù)器端接受數(shù)據(jù)的實(shí)現(xiàn),需要的朋友可以參考下
    2015-11-11
  • 判斷整數(shù)序列是否為二元查找樹的后序遍歷結(jié)果的解決方法

    判斷整數(shù)序列是否為二元查找樹的后序遍歷結(jié)果的解決方法

    本篇文章是對判斷整數(shù)序列是否為二元查找樹的后序遍歷結(jié)果的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中sizeof()與strlen()的區(qū)別詳解

    C語言中sizeof()與strlen()的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于C語言中sizeof()與strlen()區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++中前綴和數(shù)組(算法)基本介紹

    C++中前綴和數(shù)組(算法)基本介紹

    前綴和(Prefix Sum)是指數(shù)組中某個(gè)位置之前的所有元素的和,本文將介紹C++中前綴和數(shù)組(算法)基本概念,感興趣的朋友一起看看吧
    2024-12-12
  • C語言超詳細(xì)講解隊(duì)列的實(shí)現(xiàn)及代碼

    C語言超詳細(xì)講解隊(duì)列的實(shí)現(xiàn)及代碼

    隊(duì)列(Queue)與棧一樣,是一種線性存儲結(jié)構(gòu),它具有如下特點(diǎn):隊(duì)列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First?In?First?Out)的原則,簡稱FIFO結(jié)構(gòu)。在隊(duì)尾添加元素,在隊(duì)頭刪除元素
    2022-04-04
  • C語言實(shí)現(xiàn)飛機(jī)游戲(2)

    C語言實(shí)現(xiàn)飛機(jī)游戲(2)

    這篇文章主要介紹了C語言實(shí)現(xiàn)飛機(jī)游戲的第二部分,進(jìn)行功能完善,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言實(shí)現(xiàn)簡易五子棋小游戲

    C語言實(shí)現(xiàn)簡易五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評論

沈丘县| 民勤县| 洛川县| 东安县| 开远市| 远安县| 库尔勒市| 泾源县| 沈阳市| 江孜县| 大庆市| 南投市| 新蔡县| 柳州市| 宕昌县| 朔州市| 太仆寺旗| 旬阳县| 怀柔区| 柏乡县| 西青区| 天津市| 鄯善县| 安徽省| 东乡县| 双峰县| 永定县| 蓬莱市| 逊克县| 多伦县| 玉树县| 横山县| 靖远县| 阜康市| 灵川县| 建平县| 顺平县| 巴楚县| 邻水| 大石桥市| 金塔县|