在C語言中,對變數的存儲類型說明有以下四種:
1、auto 自動變數
2、register 寄存器變數
3、extern 外部變數
4、static 靜態變數
所謂存儲類型是指變數佔用內存空間的方式,也稱為存儲方式。
變數的存儲方式可分為「靜態存儲」和「動態存儲」兩種。
1、靜態存儲變數通常是在變數定義時就在存儲單元並一直保持不變,直至整個程序結束。
2、動態存儲變數是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。
如果一個函數被多次調用,則反復地分配、釋放形參變數的存儲單元。從以上分析可知,靜態存儲變數是一直存在的,而動態存儲變數則時而存在時而消失。
(1)c語言中局部變數的隱含存儲類型擴展閱讀:
變數根據定義的位置的不同的生命周期,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,類作用域,命名空間作用域和文件作用域。
一、從作用域看:
1、全局變數具有全局作用域。全局變數只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變數的定義的源文件需要用extern關鍵字再次聲明這個全局變數。
2、靜態局部變數具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束一直存在,它和全局變數的區別在於全局變數對所有函數都是可見的,而靜態局部變數只對定義自己的函數體始終可見。
3、局部變數也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束後,變數被撤銷,其所佔用的內存也被收回。
4、靜態全局變數也具有全局作用域,它與全局變數的區別在於如果程序包含多個文件的話,它作用於定義它文件里,不能作用到其他文件里,即被static關鍵字修飾過的變數具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變數,它們也是不同的變數。
二、從分配空間看:
全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間。
全局變數本身就是靜態存儲方式,靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。
而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一個源程序的其他源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。
1、靜態變數會放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
參考資料來源:網路-變數-存儲類型
㈡ C語言中,實參的隱含存儲類型是 形參的隱含存儲類型是 A、auto B、static C、extern D、register
答案都選A:上面幾位胡說霸道。
不是static 形參存儲類型只有兩種可能,一是auto類型,而是register類型。我給你細細解說
auto 就是堆棧存儲 而register的是cpu內部寄存器存儲
具體函數的形參採用那種存儲方法,這和函數的「調用規則(calling convention)」有關。
調用規則主要設計參數的傳遞,入棧順序,寄存器傳參,函數返回值的存儲和清棧者,調用規則主要有 cdecl stdcall thiscall fastcall等等。棧是函數調用必需的數據結構。你可以在函數聲明是註明函數的調用規則:如 int cdecl add (int a,int b) 。 注意函數有默認的調用規則,所以你再寫程序時,沒有必要註明調用規則。你此外還可以添加編譯選項修改調用規則。
cdecl : (c/c++語言默認的調用規則):堆棧傳參參數,因此是auto類型。
stdcall :有叫做pascal,WINAPI,這個調用規則出現在windows的API函數中。它也採用堆棧傳遞參數。
thiscall:類中的函數的調用方式:參數傳遞和編譯器有關 Windows VC中 this指針用ECX寄存器存儲,而unix gcc中 this用棧存儲。其他參數也是用棧存儲。
fastcall:用寄存器存儲部分參數加快函數調用,其他參數用棧存儲。
所以,沒有隱含的存儲類型,形參的存儲類型和調用規則有關。但是如果真要學究般的考慮這個問題,則答案選A,因為C語言函數的默認調用方式是cdecl,它的參數傳遞只採用了棧,因此是auto(答案A)
而實參的存儲類型可以是A,B,C,D四種,隱含的類型(也就是你在定義變數是,不指明存儲類型)是auto(答案A)
㈢ 【求助c語言】,凡是函數中未指定存儲類別的全局變數,其隱含的存儲類別為
全局變數其默認儲存類型都是extern
,
而局部變數的默認儲存類型是
auto,
函數中聲明的變數是局部變數,所以原題中說
「函數中未指定存儲類別的全局變數」
這句本身就有問題。
記著:
全局變數
extern
局部變數
auto
㈣ C語言中函數的隱含存儲類型
由於C函數內不能再定義函數,C函數的存儲類型只能是靜態的或外部的之一。若定義函數時不指定存儲類型是靜態的,則它的存儲類型就是外部的(extern),即函數允許被程序的其它函數調用。
㈤ C語言中,函數的隱含存儲類別是 auto 還是 extern,為什麼兩種答案我都看到過
函數的存儲類型指的是其他文件模塊可否訪問,其類別可以是extern或static。
static是指該函數只能被本源程序文件道中的模塊訪問。extern是指可被本源程序文件外的模塊訪問。
C語言中函數的存儲類型隱含為版全局的,因此默認為extern。
函數內定義的變數,默權認作用域在本函數內,即其類型是auto。
(5)c語言中局部變數的隱含存儲類型擴展閱讀:
C語言中提供了存儲說明符auto、register、extern、static說明的四種存儲類別。四種存儲類別說明符有兩種存儲期:自動存儲期和靜態存儲期。
其中auto和register對應自動存儲期。具有自動存儲期的變數在進入聲明該變數的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。在函數內部定義的變數成為局部變數。在某些C語言教材中,局部變數稱為自動變數,這就與使用可選關鍵字auto定義局部變數這一作法保持一致。
extern用在變數聲明中常常有這樣一個作用:要在*.c文件中引用另一個文件中的一個全局的變數,那就應該放在*.h中用extern來聲明這個全局變數。
extern用於變數的用法:
1、extern int a;//聲明一個全局變數a
2、int a; //定義一個全局變數a
3、extern int a =0 ;//定義一個全局變數a 並給初值。一旦給予賦值,一定是定義,定義才會分配存儲空間。(注意:經過測試在GCC中,這樣定義變數是不能通過編譯的,而在VS2013可以)
㈥ 在c語言中,未指定的局部變數,其隱含的存儲類別為靜態存儲,為什麼不對
隱含的存儲類別為動態存儲,即auto型的,如果要靜態,需要在變數前加上static關鍵字
㈦ 函數的隱含存儲類別是()
函數的存儲類型指的是其他文件模塊可否訪問,其類別可以是extern或static。
static是指該函數只能被本源程序文件道中的模塊訪問。extern是指可被本源程序文件外的模塊訪問。
C語言中函數的存儲類型隱含為版全局的,因此默認為extern。
函數內定義的變數,默權認作用域在本函數內,即其類型是auto。
(7)c語言中局部變數的隱含存儲類型擴展閱讀:
在C語言中,提供了四種存儲類型的存儲說明符:auto、Register、Extern和static。這四個存儲類別說明符有兩個存儲術語:自動存儲術語和靜態存儲術語。
「自動」和「寄存器」對應的是自動存儲周期。具有自動存儲周期的變數在進入聲明變數的塊時被創建,在塊活動時存在,在塊退出時被撤銷。在函數中定義的變數成為局部變數。在一些C教科書中,局部變數被稱為automatic,這與使用可選關鍵字auto定義局部變數的做法一致。
Extern通常用於變數聲明:在*中的另一個文件中引用全局變數。在*.h中應該使用extern來聲明全局變數。
㈧ 函數中未指定存儲類別的局部變數,其隱含的存儲類別為()
函數中未指定存儲類別的局部變數,其隱含的存儲類別為自動存儲類別。
函數中的局部變數,如果不專門聲明為static存儲類別,都是動態的分配存儲空間的,數據存儲在動態存儲區中。
這類變數叫做自動變數,自動變數可以用關鍵字auto作為存儲類別的聲明,實際上關鍵字auto是可以省略的(一般都是不寫的),不寫則自動隱含為「自動存儲類別「。
(8)c語言中局部變數的隱含存儲類型擴展閱讀:
默認情況下,在代碼塊內聲明的變數都是自動變數,但亦可用自動變數的關鍵字auto明確標識存儲類;而如若使用register(而非auto)存儲類標識代碼塊內的變數,編譯器就會將變數緩存於處理器內的寄存器中,此種情況下不能對該變數或其成員變數使用引用操作符&以獲取其地址,因為&只能獲取內存空間中的地址。
除此以外,由於寄存器的數量及其所能存儲的數據類型受硬體限制而可能無法存儲指定變數,編譯器可以忽略聲明內的register關鍵字。對於一個未初始化的自動變數來說,在為其賦值之前其值都為undefined(未定義)。
在C++中,如諺語「資源獲取即初始化」(Resource Acquisition Is Initialization,常縮寫為RAII)所述,自動變數的構造函數在程序運行至聲明部分的時候才會被調用,而當程序運行至所給的程序塊末端的時候則調用析構函數,這一特性常應用於資源的分配與釋放管理,如自動關閉已開啟的文件或自動釋放空閑內存。
㈨ 函數中未指定存儲類別的局部變數,其隱含的存儲類別為()
函數中未指定存儲類別的局部變數,其隱含的存儲類別為自動存儲類別。
函數中的局部變數,如果不專門聲明為static存儲類別,都是動態的分配存儲空間的,數據存儲在動態存儲區中。
這類變數叫做自動變數,自動變數可以用關鍵字auto作為存儲類別的聲明,實際上關鍵字auto是可以省略的(一般都是不寫的),不寫則自動隱含為「自動存儲類別「。
(9)c語言中局部變數的隱含存儲類型擴展閱讀:
默認情況下,在代碼塊內聲明的變數都是自動變數,但亦可用自動變數的關鍵字auto明確標識存儲類;而如若使用register(而非auto)存儲類標識代碼塊內的變數,編譯器就會將變數緩存於處理器內的寄存器中,此種情況下不能對該變數或其成員變數使用引用操作符&以獲取其地址,因為&只能獲取內存空間中的地址。
除此以外,由於寄存器的數量及其所能存儲的數據類型受硬體限制而可能無法存儲指定變數,編譯器可以忽略聲明內的register關鍵字。對於一個未初始化的自動變數來說,在為其賦值之前其值都為undefined(未定義)。
在C++中,如諺語「資源獲取即初始化」(Resource
Acquisition
Is
Initialization,常縮寫為RAII)所述,自動變數的構造函數在程序運行至聲明部分的時候才會被調用,而當程序運行至所給的程序塊末端的時候則調用析構函數,這一特性常應用於資源的分配與釋放管理,如自動關閉已開啟的文件或自動釋放空閑內存。
參考資料來源:鳳凰網-自動變數
㈩ C語言中函數隱含存儲類型是什麼
C語言如果不寫一個函數的返回值類型,默認隱含就是int