av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

C語言

C語言變量存儲類別和內(nèi)存四區(qū)

時間:2025-04-15 14:49:47 C語言 我要投稿
  • 相關(guān)推薦

C語言變量存儲類別和內(nèi)存四區(qū)

  C語言是一門通用計算機編程語言,應(yīng)用廣泛。C語言的設(shè)計目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。下面我們一起來看看C語言變量存儲類別和內(nèi)存四區(qū)的介紹,歡迎大家閱讀!

C語言變量存儲類別和內(nèi)存四區(qū)

  變量存儲類別

  變量聲明/定義的一般形式:

  存儲類別 數(shù)據(jù)類型 變量名

  存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方法。存儲方法分為靜態(tài)存儲和動態(tài)存儲兩大類。標(biāo)準(zhǔn)C語言為變量、常量和函數(shù)定義了4種存儲類型:extern、auto、static、register。根據(jù)變量的存儲類別,可以知道變量的作用域和存儲期。這4種存儲類型可分為兩種生存期限:永久的(在整個程序執(zhí)行期都存在)和臨時的(暫時保存在堆棧和寄存器中)。extern和static用來標(biāo)識永久生存期限的“變量和函數(shù)”,而anto和register用來標(biāo)識臨時生存期限的"變量"。只有變量才有臨時生存期限。一個變量和函數(shù)只能具有一個存儲類型,也只能有一種生存期限。

  內(nèi)存中供用戶使用的空間有三部分:

  程序區(qū):存放程序的可執(zhí)行代碼;

  靜態(tài)存儲區(qū):存放靜態(tài)變量(全局變量和靜態(tài)局部變量);

  動態(tài)存儲區(qū):存放函數(shù)調(diào)用時調(diào)用函數(shù)的現(xiàn)場保護和返回地址、函數(shù)形參、自動局部變量;

  變量的聲明分為”定義性聲明“(需建立存儲空間,如:int a;)和”引用性聲明“(不需建立存儲空間,如extern a;)。廣義上講,聲明包括定義,一般為敘述方便,把建立存儲空間的聲明稱定義,而不不需建立存儲空間的聲明稱聲明。

  auto

  函數(shù)中的局部變量,如果不用關(guān)鍵字static加以聲明,編譯系統(tǒng)對它們是動態(tài)地分配存儲空間的。函數(shù)的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量)都屬此類。在調(diào)用該函數(shù)時,系統(tǒng)給形參和函數(shù)中定義的變量分配存儲空間,數(shù)據(jù)存儲在動態(tài)存儲區(qū)中。在函數(shù)調(diào)用結(jié)束時就自動釋放這些空間。如果是在復(fù)合語句中定義的變量,則在變量定義時分配存儲空間,在復(fù)合語句結(jié)束時自動釋放空間。因此這類局部變量稱為自動變量(auto variable)。自動變量用關(guān)鍵字auto作存儲類別的聲明。

  對自動變量賦初值,不是在編譯時進行的,而是在函數(shù)調(diào)用時進行。對自動變量來說,若不賦初值,則它的值是一個不確定的值。

  int Fun(int a)

  {

  auto int b, c=3; //定義b和c為整型的自動變量,auto可省略

  b = c + a; return b;

  }

  register

  一般情況下,變量的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個變量的值時,由控制器發(fā)出指令將內(nèi)存中該變量的值送到CPU中的運算器。經(jīng)過運算器進行運算,如果需要存數(shù),再從運算器將數(shù)據(jù)送到內(nèi)存存放。為提高執(zhí)行效率,C++允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。寄存器變量的分配方式是動態(tài)分配的。

  由于CPU中的通用寄存器數(shù)目有限,通常只把少數(shù)使用頻繁的變量定義為寄存器變量。對超出寄存器數(shù)目的寄存器變量作一般自動變量處理。

  只有局部自動變量和形式參數(shù)可作為寄存器變量,其他(如全局變量、局部靜態(tài)變量等)不行。在程序中定義寄存器變量對編譯系統(tǒng)只是建議性(而不是強制性)的。當(dāng)今的優(yōu)化編譯系統(tǒng)能夠識別使用頻繁的變量,自動地將這些變量放在寄存器中。

  extern

  全局變量(外部變量)是在函數(shù)的外部定義的,它的作用域為從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為本文件中各個函數(shù)所引用。編譯時將全局變量分配在靜態(tài)存儲區(qū)。有時需要用extern來聲明全局變量,以擴展全局變量的作用域。

  1) 在一個文件內(nèi)聲明全局變量

  如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件終了。如果在定義點之前的函數(shù)想引用該全局變量,則應(yīng)該在引用之前用關(guān)鍵字extern對該變量作外部變量聲明,表示該變量是一個將在下面定義的全局變量。有了此聲明,就可以從聲明處起,合法地引用該全局變量,這種聲明稱為提前引用聲明。

  用extern聲明外部變量時,類型名可寫可不寫。例如," extern int A , B ; " 也可寫成 " extern A , B ; "。

  2) 在多文件的程序中聲明外部變量

  如果一個程序包含兩個文件,在兩個文件中都要用到同一個外部變量num,不能分別在兩個文件中各自定義一個外部變量num。正確的做法是:在任一個文件中定義外部變量num,而在另一文件中用extern對num作外部變量聲明,即 " extern int num " 或 " extern num ";編譯系統(tǒng)由此知道num是一個已在別處定義的外部變量,它先在本文件中找有無外部變量num,如果有,則將其作用域擴展到本行開始,如果本文件中無此外部變量,則在程序連接時從其他文件中找有無外部變量num,如果有,則把在另一文件中定義的外部變量num的作用域擴展到本文件,在本文件中可以合法地引用該外部變量num。

  static

  所有全局變量和用關(guān)鍵字static作存儲類型說明的局部變量稱為靜態(tài)變量。靜態(tài)變量存放在靜態(tài)存儲區(qū),一旦為其分配了存儲單元,它們在整個程序執(zhí)行期間將固定地占用這些存儲單元。若非必要,不要多用靜態(tài)局部變量。

  對全局變量,static使其局部化(局部于本文件),靜態(tài)全局變量僅能為本源文件中各函數(shù)使用,不能為本源文件以外的其他源文件使用。

  對局部變量,static使其由動態(tài)存儲變?yōu)殪o態(tài)存儲,靜態(tài)局部變量僅能為本函數(shù)使用,其他函數(shù)不能使用和影響它們。靜態(tài)局部變量是在編譯時賦初值的,且只賦初值一次。如在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)。

  注:

  內(nèi)部函數(shù)也稱靜態(tài)函數(shù),不能被其他文件中的函數(shù)使用。定義內(nèi)部函數(shù)時,在函數(shù)名和函數(shù)類型的前面加static即可。

  在C語言中,函數(shù)前如果無關(guān)鍵字extern,隱含其為外部函數(shù)。若需在其他文件的函數(shù)中調(diào)用此外部函數(shù),只需在調(diào)用的`文件中用extern聲明該外部函數(shù)。

  內(nèi)存四區(qū)

  棧區(qū)(stack)

  由編譯器自動分配釋放,存放函數(shù)的參數(shù)值、局部變量的值等;其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

  堆區(qū)(heap)

  一般由程序員分配釋放(動態(tài)內(nèi)存申請與釋放),若程序員不釋放,程序結(jié)束時可能由操作系統(tǒng)回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。

  全局區(qū)/靜態(tài)區(qū)(static)

  全局變量和靜態(tài)變量的存儲是放在一起的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,該區(qū)域在程序結(jié)束后由操作系統(tǒng)釋放;

  常量區(qū):字符串常量和其他常量的存儲位置,程序結(jié)束后由操作系統(tǒng)釋放。

  程序代碼區(qū)(code)

  存放函數(shù)的二進制代碼。

  函數(shù)調(diào)用模型必須和程序四內(nèi)存區(qū)綜合起來考慮:

  主調(diào)函數(shù)分配的內(nèi)存(棧區(qū)、堆區(qū)、全局區(qū))都可以在被調(diào)用函數(shù)中使用;

  被調(diào)用函數(shù)中分配的內(nèi)存,要分情況:在棧區(qū)中分配的內(nèi)存,在主調(diào)函數(shù)中是不能使用的;

【C語言變量存儲類別和內(nèi)存四區(qū)】相關(guān)文章:

C語言變量存儲布局07-05

C語言中變量儲存的類別07-24

C/C++變量在內(nèi)存中的分布05-03

C語言局部變量和全局變量06-25

C/C++變量在內(nèi)存中的分布介紹06-18

C語言變量定義07-29

C語言變量理解07-28

C語言變量的類型10-30

C語言變量的使用10-12