存儲變數的函數
在C語言中,對變數的存儲類型說明有以下四種:
1、auto 自動變數
2、register 寄存器變數
3、extern 外部變數
4、static 靜態變數
所謂存儲類型是指變數佔用內存空間的方式,也稱為存儲方式。
變數的存儲方式可分為「靜態存儲」和「動態存儲」兩種。
1、靜態存儲變數通常是在變數定義時就在存儲單元並一直保持不變,直至整個程序結束。
2、動態存儲變數是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。
如果一個函數被多次調用,則反復地分配、釋放形參變數的存儲單元。從以上分析可知,靜態存儲變數是一直存在的,而動態存儲變數則時而存在時而消失。
(1)存儲變數的函數擴展閱讀:
變數根據定義的位置的不同的生命周期,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,類作用域,命名空間作用域和文件作用域。
一、從作用域看:
1、全局變數具有全局作用域。全局變數只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變數的定義的源文件需要用extern關鍵字再次聲明這個全局變數。
2、靜態局部變數具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束一直存在,它和全局變數的區別在於全局變數對所有函數都是可見的,而靜態局部變數只對定義自己的函數體始終可見。
3、局部變數也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束後,變數被撤銷,其所佔用的內存也被收回。
4、靜態全局變數也具有全局作用域,它與全局變數的區別在於如果程序包含多個文件的話,它作用於定義它文件里,不能作用到其他文件里,即被static關鍵字修飾過的變數具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變數,它們也是不同的變數。
二、從分配空間看:
全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間。
全局變數本身就是靜態存儲方式,靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。
而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一個源程序的其他源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。
1、靜態變數會放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
參考資料來源:網路-變數-存儲類型
『貳』 c語言的內存變數
存儲類別指的是數據在內存中存儲的方法。存儲方法分為靜態存儲和動態存儲兩大類。標准C語言為變數、常量和函數定義了4種存儲類型:extern、auto、static、register。根據變數的存儲類別,可以知道變數的作用域和存儲期。這4種存儲類型可分為兩種生存期限:永久的(在整個程序執行期都存在)和臨時的(暫時保存在堆棧和寄存器中)。extern和static用來標識永久生存期限的「變數和函數」,而anto和register用來標識臨時生存期限的"變數"。只有變數才有臨時生存期限。一個變數和函數只能具有一個存儲類型,也只能有一種生存期限。
內存中供用戶使用的空間有三部分:
程序區:存放程序的可執行代碼;
靜態存儲區:存放靜態變數(全局變數和靜態局部變數);
動態存儲區:存放函數調用時調用函數的現場保護和返回地址、函數形參、自動局部變數;
變數的聲明分為」定義性聲明「(需建立存儲空間,如:int a;)和」引用性聲明「(不需建立存儲空間,如extern a;)。廣義上講,聲明包括定義,一般為敘述方便,把建立存儲空間的聲明稱定義,而不不需建立存儲空間的聲明稱聲明。
auto
函數中的局部變數,如果不用關鍵字static加以聲明,編譯系統對它們是動態地分配存儲空間的。函數的形參和在函數中定義的變數(包括在復合語句中定義的變數)都屬此類。在調用該函數時,系統給形參和函數中定義的變數分配存儲空間,數據存儲在動態存儲區中。在函數調用結束時就自動釋放這些空間。如果是在復合語句中定義的變數,則在變數定義時分配存儲空間,在復合語句結束時自動釋放空間。因此這類局部變數稱為自動變數(auto variable)。自動變數用關鍵字auto作存儲類別的聲明。
對自動變數賦初值,不是在編譯時進行的,而是在函數調用時進行。對自動變數來說,若不賦初值,則它的值是一個不確定的值。
『叄』 C語言中函數是如何存儲的
1. 代碼本身是存儲在內存的代碼段中的,而函數沒有說存儲的概念,函數調用時是通過棧來實現的。
2.在函數體內聲明的變數在默認情況下都是auto存儲類型
在代碼塊之間傳遞信息的一種方法就是使用外部變數。當一個變數在函數的外部被聲明時,安的存儲空間是永久分配的,安人存儲類型是extren.外部變數的聲明看上去和函數或代碼塊內部所聲明的變數一樣。外部變數對於它之後的所有函數都有效。在代碼塊或函數後,外部變數仍然存在。
3.static的基本用途是允許一個局部變數在重新進入代碼塊時能夠保持原來的值。這和自動變數形成了鮮明的對比,自動變數在代碼塊時會被銷毀,再次進入這個代碼塊時,它必須重新進行初始化。
4.egister存儲類型告訴編譯器相關的變數應該改量存儲在高速度的寄存器中。使用register存儲類型的目的一般是為了提高執行速度,但是,register聲明只是向編譯器所提出的「建議」,並非強制要求。
『肆』 C語言關於函數變數的四個存儲類型
在函數體內聲明的變數在默認情況下都是auto存儲類型
在代碼塊之間傳遞信息的一種方法就是使用外部變數。當一個變數在函數的外部被聲明時,安的存儲空間是永久分配的,安人存儲類型是extren.外部變數的聲明看上去和函數或代碼塊內部所聲明的變數一樣。外部變數對於它之後的所有函數都有效。在代碼塊或函數後,外部變數仍然存在。
static的基本用途是允許一個局部變數在重新進入代碼塊時能夠保持原來的值。這和自動變數形成了鮮明的對比,自動變數在代碼塊時會被銷毀,再次進入這個代碼塊時,它必須重新進行初始化。
register存儲類型告訴編譯器相關的變數應該改量存儲在高速度的寄存器中。使用register存儲類型的目的一般是為了提高執行速度,但是,register聲明只是向編譯器所提出的「建議」,並非強制要求。
『伍』 C++局部變數的存儲方式有哪幾種
靜態存儲方式與動態存儲方式(具體:自動的、靜態的、寄存器的register、外部的extern)
在內存中的用戶的存儲空間分為:程序區、靜態存儲區、動態存儲區。
靜態存儲方式:在程序運行期間,系統對變數分配的固定空間。
動態存儲方式:在程序運行期間,系統對變數分配的動態空間
1>用static來聲明靜態局部變數,局部變數的值在函數結束後不消失而保留原值,即其佔用的存儲單元不釋放,在下一次該函數調用時,該變數保留上次函數調用結束時的值。靜態局部變數的默認值為0.
2>動態的局部變數當函數體被調用完畢時,變數的空間被釋放。