當前位置:首頁 » 存儲配置 » 函數的隱含存儲類型

函數的隱含存儲類型

發布時間: 2022-08-02 04:04:09

c語言中函數的隱含存儲類型

auto
自動存儲類別

關於動態存儲方式與靜態動態存儲方式

從變數的作用域(即從空間)角度來分,可以分為全局變數和局部變數。

從另一個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態存儲方式和動態存儲方式。

靜態存儲方式:是指在程序運行期間分配固定的存儲空間的方式。

動態存儲方式:是在程序運行期間根據需要進行動態的分配存儲空間的方式。


用戶存儲空間可以分為三個部分:

程序區;

靜態存儲區;

動態存儲區。


全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放。

動態存儲區存放以下數據:

函數形式參數;

自動變數(未加static聲明的局部變數);

函數調用實的現場保護和返回地址。


對以上這些數據,在函數開始調用時分配動態存儲空間,函數結束時釋放這些空間。

在C語言中,每個變數和函數有兩個屬性:數據類型和數據的存儲類別。

auto變數

函數中的局部變數,如不專門聲明為static存儲類別,都是動態地分配存儲空間的,數據存儲在動態存儲區中。

函數中的形參和在函數中定義的變數(包括在復合語句中定義的變數),都屬此類,在調用該函數時系統會給它們分配存儲空間,在函數調用結束時就自動釋放這些存儲空間。這類局部變數稱為自動變數。自動變數用關鍵字auto作存儲類別的聲明。例如:int f(int a){ /* 定義f函數,a為參數 */ auto int b,c=3; /*定義b,c自動變數*/ /* …… */}
a是形參,b,c是自動變數,對c賦初值3。執行完f函數後,自動釋放a,b,c所佔的存儲單元。

關鍵字auto可以省略,auto不寫則隱含定為「自動存儲類別」,屬於動態存儲方式。

用static聲明局部變數

有時希望函數中的局部變數的值在函數調用結束後不消失而保留原值,這時就應該指定局部變數為「靜態局部變數」,用關鍵字static進行聲明。

【例8-15】考察靜態局部變數的值。

#include<stdio.h>intf(inta){autointb=0;staticintc=3;b=b+1;c=c+1;return(a+b+c);}intmain(void){inta=2,i;for(i=0;i<3;i++)printf("%d
",f(a));return0;}


對靜態局部變數的說明:

靜態局部變數屬於靜態存儲類別,在靜態存儲區內分配存儲單元。在程序整個運行期間都不釋放。而自動變數(即動態局部變數)屬於動態存儲類別,占動態存儲空間,函數調用結束後即釋放。

靜態局部變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函數調用時進行,每調用一次函數重新給一次初值,相當於執行一次賦值語句。

如果在定義局部變數時不賦初值的話,則對靜態局部變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是一個不確定的值。


【例8-16】列印1到5的階乘值。

#include<stdio.h>intfac(intn){staticintf=1;f=f*n;returnf;}intmain(void){inti;for(i=1;i<=5;i++)printf("%d!=%d
",i,fac(i));return0;}

register變數

為了提高效率,C語言允許將局部變數得值放在CPU中的寄存器中,這種變數叫「寄存器變數」,用關鍵字register作聲明。

【例8-17】使用寄存器變數。

#include<stdio.h>intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*i;returnf;}intmain(void){inti;for(i=0;i<=5;i++)printf("%d!=%d
",i,fac(i));return0;}


對寄存器變數的幾點說明:

只有局部自動變數和形式參數可以作為寄存器變數;

一個計算機系統中的寄存器數目有限,不能定義任意多個寄存器變數;

局部靜態變數不能定義為寄存器變數。

用extern聲明外部變數

外部變數(即全局變數)是在函數的外部定義的,它的作用域為從變數定義處開始,到本程序文件的末尾。如果外部變數不在文件的開頭定義,其有效的作用范圍只限於定義處到文件終了。如果在定義點之前的函數想引用該外部變數,則應該在引用之前用關鍵字extern對該變數作「外部變數聲明」。表示該變數是一個已經定義的外部變數。有了此聲明,就可以從「聲明」處起,合法地使用該外部變數。

⑵ c語言中,函數的隱含存儲類別及形參的默認存儲類別分別是

c語言中,函數的隱含存儲類別是extern
形參的默認存儲類別是auto

⑶ 在C語言中函數的隱含存儲類型是

函數的隱含存儲類型是extern,按照C語言的原則,函數隱含為全局都可以訪問,因此默認為extern,而auto只用於變數,是變數的隱含存儲類型。

⑷ 函數中未指定存儲類別的局部變數,其隱含的存儲類別為()

函數中未指定存儲類別的局部變數,其隱含的存儲類別為自動存儲類別。

函數中的局部變數,如果不專門聲明為static存儲類別,都是動態的分配存儲空間的,數據存儲在動態存儲區中。

這類變數叫做自動變數,自動變數可以用關鍵字auto作為存儲類別的聲明,實際上關鍵字auto是可以省略的(一般都是不寫的),不寫則自動隱含為「自動存儲類別「。

(4)函數的隱含存儲類型擴展閱讀:

默認情況下,在代碼塊內聲明的變數都是自動變數,但亦可用自動變數的關鍵字auto明確標識存儲類;而如若使用register(而非auto)存儲類標識代碼塊內的變數,編譯器就會將變數緩存於處理器內的寄存器中,此種情況下不能對該變數或其成員變數使用引用操作符&以獲取其地址,因為&只能獲取內存空間中的地址。

除此以外,由於寄存器的數量及其所能存儲的數據類型受硬體限制而可能無法存儲指定變數,編譯器可以忽略聲明內的register關鍵字。對於一個未初始化的自動變數來說,在為其賦值之前其值都為undefined(未定義)。

在C++中,如諺語「資源獲取即初始化」(Resource Acquisition Is Initialization,常縮寫為RAII)所述,自動變數的構造函數在程序運行至聲明部分的時候才會被調用,而當程序運行至所給的程序塊末端的時候則調用析構函數,這一特性常應用於資源的分配與釋放管理,如自動關閉已開啟的文件或自動釋放空閑內存。

⑸ C語言中,函數的隱含存儲類型是:A. auto B.static C.extern D.register

C。

C語言規定,只要在定義函數時不進行存儲類型的顯式說明,函數的存儲類型就隱含為外部類型,即extern型,外部類型允許其他文件中的函數調用。

實際上函數的聲明和定義都不需要添加extern關鍵字,在實際使用的時候也最好不要添加關鍵字。

如果一個函數是不會被其它文件調用的,那麼這個函數應該被聲明成static的。

如:

extern int func(void){

return 0;

}

int func(void){

return 0;

}

是等價的,另外

extern int func(void);

int func(void);是等價的。

(5)函數的隱含存儲類型擴展閱讀:

函數調用的一般形式為:

函數名(實參表列);

如果是調用無參函數,則"實參表列"可以沒有,但括弧不能省略。如果實參表列包含多個實參,則個參數間用逗號隔開。實參與形參的個數應相等,類型應一致。

實參與形參按順序對應,一一傳遞數據。但應說明,如果實參表列包括多個實參,對實參求值的順序並不是確定的,有的系統按自左至右順序求實參的值,有的系統則按自右至左順序

網路-c函數

⑹ 18. 在C語言中,函數的隱含存儲類別是( )。 (A) auto (B) static (C) extern (D) 無存儲類別

形參是放在堆棧中的除非特殊聲明的函數如cxxbuilder
fastcall!所以選a;
參數一般不會聲明為寄存器變數的!這樣的函數沒有辦法調用!
因為形參放在何處由函數的調用約定來確定,而不是由參數的存儲類型決定!
同樣外部變數或靜態變數也不會,不能定義成寄存器變數。
寄存器變數只適合函數內部定義的,用完不管的,通常是循環的計數變數!
靜態和外部是常用的兩個存儲類型。
外部變數一定在函數外部定義,這就是c,c++,外部變數中的「外部」的真實含義。
靜態變數,可以定義在
1)函數外部,屬於文件模塊的,表示文件內部的具有全局性質的局部變數(存儲在全局數據區。
2)函數內部,第一層大括弧內,屬整個函數全局性質的局部變數。
存儲在全局數據區。
3)函數內部的任何非數據定義的兩個大括弧內部;
分程序(c一般叫語句組)屬整個分程序全局性質的局部變數。存儲在全局數據區。
而函數內的非靜態數據預設為自動變數,所auto一般會省略不寫。
外部變數,一般定義時也省略掉extern,
只有在頭文件里,和使用非本文件定義的外部變數時,以及函數內部引用外部變數時,
才寫上extern
表示這是引用說明,不是定義,要看定義別處找找。
如果本文件沒定義,就是引用別的文件的同名變數!
所以除了函數參數(形參)和函數內部非靜態變數,再沒有自動變數了。
函數內部可以定義三種變數,局部靜態變數,自動變數,寄存器變數;外部變數在函數內部只能有引用說明!不能在函數內部定義!
extern外部,靜態static兩個存儲類型是相對的。
外部變數,全部在函數外部定義。外部變數,分配在全局數據區,是全局變數。
外部是相對函數的。
靜態有定義在函數內部,和函數外部的區分,還有函數內部全局,和函數內部某一語句組內部的區分,實際上,無論哪種靜態變數,都屬於全局變數,分配在全局數據區。
ps:
除了變數外,函數也有
extern外部,靜態static
兩種存儲類型。
由於c語言不允許函數內部定義函數。
所以函數只有這兩種存儲類型。
函數的預設存儲類型是extern,
所以無論定義,還是引用說明,通常都會省略extern;
c語言中,只有寫了static的函數,才是靜態函數。
c語言中,函數可以在函數內部,有引用說明,不會在函數定義在函數內部。
c++中
類也有靜態變數和靜態函數;
由於類的靜態函數和靜態變數的外部定義會有類名和作用域限定符(也叫作用域運算符)::作為前綴,所以類外定義不寫static;
類也有靜態變數和靜態函數的含義是這個變數和函數屬於整個類的(實際也是全局變數,分配在全局數據區),除了類和他的成員,外不能使用它了。
類通過類名,成員通過它本身(obj.
;pobj->;
(*pobj).
refobj.
類名::)使用;
只要類本身定義了。
不通過類的對象,就可以使用類的靜態變數和靜態函數。
其他成員,除了構造函數外都必須通過通過類的對象,才能使用。

⑺ 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 型

⑼ C語言中,函數的隱含存儲類別是 auto 還是 extern,為什麼兩種答案我都看到過

函數的存儲類型指的是其他文件模塊可否訪問,其類別可以是extern或static。

static是指該函數只能被本源程序文件道中的模塊訪問。extern是指可被本源程序文件外的模塊訪問。

C語言中函數的存儲類型隱含為版全局的,因此默認為extern。

函數內定義的變數,默權認作用域在本函數內,即其類型是auto。

(9)函數的隱含存儲類型擴展閱讀:

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語言中函數隱含存儲類型是什麼

函數的隱含存儲類型是extern,按照c語言的原則,函數隱含為全局都可以訪問,因此默認為extern,而auto只用於變數,是變數的隱含存儲類型。

熱點內容
cmdc語言 發布:2024-10-05 15:58:32 瀏覽:550
伺服器怎麼弄公網ip 發布:2024-10-05 15:57:02 瀏覽:640
設備配置在什麼地方 發布:2024-10-05 15:44:59 瀏覽:249
matlab外部介面編程 發布:2024-10-05 15:36:58 瀏覽:365
C事件編程 發布:2024-10-05 15:15:43 瀏覽:639
一台伺服器出現兩IP 發布:2024-10-05 15:10:05 瀏覽:925
md5加密演算法c 發布:2024-10-05 15:05:40 瀏覽:761
如何重設控制器密碼 發布:2024-10-05 14:19:13 瀏覽:439
安卓如何遠程簽到 發布:2024-10-05 14:11:11 瀏覽:301
阿里雲伺服器控制面板 發布:2024-10-05 13:57:48 瀏覽:820