自動 靜態 寄存 易失
一說是
自動(auto)、靜態(static)、寄存器的(register)和外部的(extern)
然而某認為extern是用來對編譯器進行聲明變數的,而不是定義。
② C語言中全局變數的儲存類別是
C語言中全局變數的儲存類別是靜態存儲區。
由某對象或某個函數所創建的變數通常都是局部變數,只能被內部引用,而無法被其它對象或函數引用。
全局變數既可以是某對象函數創建,也可以是在本程序任何地方創建。全局變數是可以被本程序所有對象或函數引用。
(2)語言變數存儲類別擴展閱讀:
使用全局變數會佔用更多的內存(因為其生命期長),不過在計算機配置很高的今天,這個不應該算什麼問題,除非使用的是巨大對象的全局變數,能避免就一定要避免。
使用全局變數程序運行時速度更快一些(因為內存不需要再分配),同樣也快不了多少。對於局部變數的名字空間污染,這個在不使用太多變數時是可以避免的。
當全局變數與局部變數重名的時候,起作用的是局部變數,全局變數被屏蔽掉。還可以用extern在函數外對全局變數聲明,使全局變數的作用域從聲明處到文件的結束。
③ C語言中變數的存儲類型有哪幾種,存儲方式哪幾種謝嘍
在C語言中,對變數的存儲類型說明有以下四種:
1、auto 自動變數
2、register 寄存器變數
3、extern 外部變數
4、static 靜態變數
所謂存儲類型是指變數佔用內存空間的方式,也稱為存儲方式。
變數的存儲方式可分為「靜態存儲」和「動態存儲」兩種。
1、靜態存儲變數通常是在變數定義時就在存儲單元並一直保持不變,直至整個程序結束。
2、動態存儲變數是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。
如果一個函數被多次調用,則反復地分配、釋放形參變數的存儲單元。從以上分析可知,靜態存儲變數是一直存在的,而動態存儲變數則時而存在時而消失。
(3)語言變數存儲類別擴展閱讀:
變數根據定義的位置的不同的生命周期,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,類作用域,命名空間作用域和文件作用域。
一、從作用域看:
1、全局變數具有全局作用域。全局變數只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變數的定義的源文件需要用extern關鍵字再次聲明這個全局變數。
2、靜態局部變數具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束一直存在,它和全局變數的區別在於全局變數對所有函數都是可見的,而靜態局部變數只對定義自己的函數體始終可見。
3、局部變數也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束後,變數被撤銷,其所佔用的內存也被收回。
4、靜態全局變數也具有全局作用域,它與全局變數的區別在於如果程序包含多個文件的話,它作用於定義它文件里,不能作用到其他文件里,即被static關鍵字修飾過的變數具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變數,它們也是不同的變數。
二、從分配空間看:
全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間。
全局變數本身就是靜態存儲方式,靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。
而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一個源程序的其他源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。
1、靜態變數會放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
參考資料來源:網路-變數-存儲類型
④ 在C語言中,全局變數的存儲類別是
全局變數的存儲類別是靜態存儲區。
變數分為局部與全局,局部變數又可稱之為內部變數。由某對象或某個函數所創建的變數通常都是局部變數,只能被內部引用,而無法被其它對象或函數引用。
全局變數既可以是某對象函數創建,也可以是在本程序任何地方創建。全局變數是可以被本程序所有對象或函數引用。
由下圖可以看出a、b、x、y 都是在函數外部定義的外部變數,都是全局變數。但x,y 定義在函數f1之後,而在f1內又無對x,y的說明,所以它們在f1內無效。 a,b定義在源程序最前面,因此在f1,f2及main內不加說明也可使用。
全局變數是使用相同的內存塊在整個類中存儲一個值全局變數extern與static,extern在其他源程序中也可以使用;static只能在本程序中使用。
(4)語言變數存儲類別擴展閱讀:
數據區可以分為靜態數據區(全局數據區)和動態數據區,後者又可分為堆區和棧區。之所以這樣劃分,是因為它們存放的數據和對應的管理方法不同。
靜態數據區、棧區和堆區的存儲空間分別遵循3種不同的規則:靜態存儲分配、棧式存儲分配和堆式存儲分配。後兩種分配方式皆稱為「動態存儲分配」,因為這兩種方式中存儲空間並不是在編譯的時候靜態分配好的,而是在運行時才進行的。
某些編程語言,如早期的FORTRAN語言及COBOL語言等,其存儲分配是完全靜態的,程序的數據對象與其存儲的綁定是在編譯期間進行的,稱為靜態語言。
而對於另一些語言,所有數據對象與其存儲的綁定只能發生在運行期間,此類語言稱為動態語言,如Lisp、ML、Perl等。多數語言(如C/C++、Java、Pascal等)採取的存儲分配策略是介於二者之間的。
⑤ 在C語言中,全局變數的存儲類別是什麼
內存中供用戶使用的存儲空間分為代碼區與數據區兩個部分。變數存儲在數據區,數據區又可分為靜態存儲區與動態存儲區。
靜態存儲是指在程序運行期間給變數分配固定存儲空間的方式。如全局變數存放在靜態存儲區中,程序運行時分配空間,程序運行完釋放。
動態存儲是指在程序運行時根據實際需要動態分配存儲空間的方式。如形式參數存放在動態存儲區中,在函數調用時分配空間,調用完成釋放。
C語言中對變數的說明包括兩方面的內容:變數類型以及變數的存儲類型。變數類型如:int(整形),char(字元型)是用來說明變數所佔用的內存空間的大小。變數存儲類型用來說明變數的作用范圍。
⑥ c語言變數的儲存類別及各自的特點
你自己根據需要歸納吧~
C語言變數存儲類型
auto
static
extern
static extern
register
auto 局部變數
auto 變數是用堆棧(stack)方式佔用儲存器空間,因此,當執行此區段是,系統會立即為這個變數分配存儲器空間,而程序執行完後,這個堆棧立即被系統收回.在大括弧{}內聲明.
自動變數就是指在函數內部定義使用的變數。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變數。自動變數是局部變數,即它的區域性是在定義他的函數內部有效。當然這說明自動變數也沒有鏈接性,因為它也不允許其他的文件訪問他。由於自動變數在定義他的函數的外面的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變數,他們之間不會發生沖突的。因為他們都有自己的區域性,而且它沒有鏈接性(即:不允許其他的文件訪問他的)。來看看自動量的持續性。計算機在執行這個函數的時候,創建並為它分配內存,當函數執行完畢返回後,自動變數就會被銷毀。這個過程是通過一個堆棧的機制來實現的。為自動變數分配內存就壓棧,而函數返回時就退棧。
static 靜態變數
一、局部靜態變數
局部變數按照存儲形式可分為三種auto, static, register。
與auto類型(普通)局部變數相比, static局部變數有三點不同:
1. 存儲空間分配不同
auto類型分配在棧上, 屬於動態存儲類別, 占動態存儲區空間, 函數調用結束後自動釋放, 而static分配在靜態存儲區, 在程序整個運行期間都不釋放. 兩者之間的作用域相同, 但生存期不同.
2. static局部變數在所處模塊在初次運行時進行初始化工作, 且只操作一次。
3. 對於局部靜態變數, 如果不賦初值, 編譯期會自動賦初值0或空字元, 而auto類型的初值是不確定的.
特點: static局部變數的」記憶性」與生存期的」全局性」
所謂」記憶性」是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.
注意事項:
1. 「記憶性」, 程序運行很重要的一點就是可重復性, 而static變數的」記憶性」破壞了這種可重復性, 造成不同時刻至運行的結果可能不同.
2. 「生存期」全局性和唯一性. 普通的local變數的存儲空間分配在stack上, 因此每次調用函數時, 分配的空間都可能不一樣, 而static具有全局唯一性的特點, 每次調用時, 都指向同一塊內存, 這就造成一個很重要的問題 ---- 不可重入性!!!
二、外部靜態變數/函數
在C中static有了第二種含義:用來表示不能被其它文件訪問的全局變數和函數。, 但為了限制全局變數/函數的作用域, 函數或變數前加static使得函數成為靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件(所以又稱內部函數)。注意此時, 對於外部(全局)變數, 不論是否有static限制, 它的存儲區域都是在靜態存儲區, 生存期都是全局的. 此時的static只是起作用域限製作用, 限定作用域在本模塊(文件)內部.
使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
extern 變數
外部變數 定義在程序外部,所有的函數很程序段都可以使用.
外部變數可能會在某一程序段被重新定義,以段內變數為參考值.
static extern 變數
靜態外部變數和外部變數差別在於,外部變數生命可以同時給多個文件使用,而靜態外部變數則只能給聲明此變數的文件使用.
register 變數
寄存器變數,是由寄存器分配空間,訪問速度比訪問內存快,加快執行速度.寄存器大小有限.
在c語言當中可以使用寄存器變數來優化程序的性能,最常見的是在一個函數體當中,將一個常用的變數聲明為寄存器變數: register int ra; 如果可能的話,編譯器就會為它分配一個單獨的寄存器,在整個函數執行期間對這個變數的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了性能。
不能用於全局變數。現在的情況是VC忽略用戶定義的REGISTER,因此定義一個REGISTER變數與不定義一個REGISTER是一樣的,編譯器進行相同的優化,因為MS認為,REGISTER是系統中寶貴的資源,應該由系統統一調配,而且認為VC編譯器的優化能力要大於一般的程序員。因此也有人說register關鍵字在PC機(x86CPU)無用,編譯器按自動變數處理。
注意: register是不能取址的。
register int j; int *p = &j;是錯的,因為無法對寄存器的定址。
⑦ C語言中有哪些存儲類型
Turbo C2.0支持四種變數存儲類型。說明符如下:
auto static extern register
下面分別來介紹。
一、auto
auto稱為自動變數。
局部變數是指在函數內部說明的變數(有時也稱為自動變數)。用關鍵字auto進
行說明, 當auto省略時, 所有的非全程變數都被認為是局部變數, 所以auto實際上
從來不用。
局部變數在函數調用時自動產生, 但不會自動初始化, 隨函數調用的結束, 這
個變數也就自動消失了, 下次調用此函數時再自動產生, 還要再賦值, 退出時又自
動消失。
二、static
static稱為靜態變數。根據變數的類型可以分為靜態局部變數和靜態全程變數。
1. 靜態局部變數
它與局部變數的區別在於: 在函數退出時, 這個變數始終存在, 但不能被其它
函數使用, 當再次進入該函數時, 將保存上次的結果。其它與局部變數一樣。
2. 靜態全程變數
Turbo C2.0允許將大型程序分成若干獨立模塊文件分別編譯, 然後將所有模塊
的目標文件連接在一起, 從而提高編譯速度, 同時也便於軟體的管理和維護。靜態
全程變數就是指只在定義它的源文件中可見而在其它源文件中不可見的變數。它與
全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它源文件使用,
而靜態全程變數卻不能再被說明為外部的, 即只能被所在的源文件使用。
三、extern
extern稱為外部變數。為了使變數除了在定義它的源文件中可以使用外, 還要
被其它文件使用。因此, 必須將全程變數通知每一個程序模塊文件, 此時可用
extern來說明。
四、register
register稱為寄存器變數。它只能用於整型和字元型變數。定義符register說
明的變數被Turbo C2.0存儲在CPU的寄存器中, 而不是象普通的變數那樣存儲在內
存中, 這樣可以提高運算速度。但是Turbo C2.0隻允許同時定義兩個寄存器變數,
一旦超過兩個, 編譯程序會自動地將超過限制數目的寄存器變數當作非寄存器變數
來處理。因此, 寄存器變數常用在同一變數名頻繁出現的地方。
另外, 寄存器變數只適用於局部變數和函數的形式參數, 它屬於auto型變數,
因此, 不能用作全程變數。定義一個整型寄存器變數可寫成:
register int a;
對於以上所介紹的變數類型和變數存儲類型將會在以後的學習中, 通過例行程
序中的定義、使用來逐漸加深理解。
⑧ C語言中有哪些存儲類型
c語言中的存儲類型有auto, extern, register, static 這四種,存儲類型說明了該變數要在進程的哪一個段中分配內存空間,可以為變數分配內存存儲空間的有數據區、BBS區、棧區、堆區。
1. auto存儲類型
auto只能用來標識局部變數的存儲類型,對於局部變數,auto是默認的存儲類型,不需要顯示的指定。因此,auto標識的變數存儲在棧區中。
2. extern存儲類型
extern用來聲明在當前文件中引用在當前項目中的其它文件中定義的全局變數。如果全局變數未被初始化,那麼將被存在BBS區中,且在編譯時,自動將其值賦值為0,如果已經被初始化,那麼就被存在數據區中。全局變數,不管是否被初始化,其生命周期都是整個程序運行過程中,為了節省內存空間,在當前文件中使用extern來聲明其它文件中定義的全局變數時,就不會再為其分配內存空間。
3. register存儲類型
聲明為register的變數在由內存調入到CPU寄存器後,則常駐在CPU的寄存器中,因此訪問register變數將在很大程度上提高效率,因為省去了變數由內存調入到寄存器過程中的好幾個指令周期。
4. static存儲類型
被聲明為靜態類型的變數,無論是全局的還是局部的,都存儲在數據區中,其生命周期為整個程序,如果是靜態局部變數,其作用域為一對{}內,如果是靜態全局變數,其作用域為當前文件。靜態變數如果沒有被初始化,則自動初始化為0。靜態變數只能夠初始化一次。