關於c語言auto變數和static變數區別

2022-02-16 02:28:37 字數 5096 閱讀 5271

1樓:匿名使用者

一、主體不同

1、auto變數:是一個c/c++語言儲存型別,僅在語句塊內部使用。

2、static變數:在計算機程式設計領域指在程式執行前系統就為之靜態分配儲存空間的一類變數。

二、作用域範圍不同

1、auto變數:初始化可為任何表示式,其特點是當執行流程進入該語句塊的時候初始化可為任何表示式。

2、static變數:針對某一原始檔的以static宣告的檔案級變數與函式的作用域只限於檔案內(只在檔案內可見),也即「內部連線」,因而可以用來限定變數的作用域。

三、特點不同

1、auto變數:具有自動儲存期的變數在進入宣告該變數的程式塊時被建立,它在該程式塊活動時存在,退出該程式塊時撤銷。

2、static變數:在函式內以static宣告的變數雖然與自動區域性變數的作用域相同,但儲存空間是以靜態分配而非預設的自動分配方式獲取的,因而儲存空間所在區域不同。

2樓:倉鼠說籃球

自動變數(auto變數)和靜態變數(static變數)主要有以下幾點區別:

1、static變數存放在靜態儲存區,在程式整個執行期間都不釋放;而auto變數存放在動態儲存區,隨著生命週期的結束而立即釋放。

2、static變數只賦值一次,以後就不用賦值;而auto變數在函式每呼叫一次都要賦初值。

3、如果使用者不對static變數賦初值,則預設為0或'\0';而auto變數為不確定值。

3樓:張震是

1、儲存部位不同

auto變數會儲存在堆疊裡面,每次定義的時候會分配儲存區,而在用完釋放的時候會收回儲存區。

static變數會被儲存在靜態儲存區。

2、初始化不同

初始化的時候,如果不賦初值,auto變數是不確定的。c預設的就是auto型別。static變數宣告的時候,如果不初始化,編譯器會自動初始化。

3、保留的資料不同

static 變數,每次使用的時候會保留上一次的值,即使重新定義,也不會改變static 變數的值。而auto變數不會。

擴充套件資料

static變數用途

1、作常量使用

靜態變數也可以用於儲存常數。具體來說,靜態變數(全域性變數及組合語言裡定義的符號亦同)可用const,constant或final(根據語言決定)等關鍵字標識,這時其值就會在編譯時設定,並且無法在執行時改變。

編譯器通常將靜態常量與文字一起置於目標檔案的文字區域,而非常量初始化資料則置於資料區;而如若有需要,有些編譯器還可選擇為其開闢專用區;為防止常數變數被錯誤的指標寫入覆蓋,亦可在這塊區域啟用記憶體保護機制。

2、c族語言中的實現

在c語言及由其派生出的c++與objective-c等程式語言中,「static」是用於控制變數的生命週期和連線方式(即其作用域,亦即可見性)的保留字。

確切來說,正如c族語言中的extern,auto與register這些保留字一樣,static也是一種儲存類(此處的「類」與面嚮物件語言的「類」的定義不同)標識。

每個變數與函式都有以上的一種儲存類標識,如果在宣告中沒有明確標識其儲存類,編譯時就會根據上下文來選擇其預設儲存類,如在原始檔裡的所有檔案級變數對應的預設儲存類是extern,而在函式體內的變數對應的則是auto,各儲存類的屬性如下表所列。

4樓:

auto變數儲存在動態儲存區,static變數儲存在靜態儲存區,主要區別是:在多次使用被調函式中,每執行一次,auto的值都保留原始值(與你的程式執行沒關係),但是static卻和呼叫函式的具體過程有關,即保留上次的值,兩者在主函式中的功能是一樣的。

5樓:匿名使用者

static 是靜態變數 就是在程序執行整個過程中一直存在的 ,函式裡的 static變數可以儲存上次執行時的值 在下次呼叫時使用

函式外的 static 變數只在本檔案中可以使用 ,在同時編譯的其他檔案中是不能訪問的

auto 變數就是函式執行時存在 函式結束了變數就不存在了,下次再執行到這裡,再次使用,結束時再次失效

一時理解不了沒關係,慢慢會理解的。

6樓:匿名使用者

auto變數,預設的型別,一般宣告時不用加,這種變數超出作用域就消失了,不能再用了,

static變數可以和全域性變數有同樣的生存期。

7樓:

auto是自動儲存 生存週期很短 static為靜態宣告 生存週期一直存在

8樓:說歷史的大白

static是以前次的結果為基礎的

9樓:匿名使用者

在這兩段程式中,在第一個中,當主函式每次呼叫addone()函式時,所定義的變數ia的初始值都是1;而在第二個中,主函式第一次呼叫addone()函式時,ia=1,當第二次呼叫時,ia的初始值就是上一次執行addone()函式後ia的值了;

static 是靜態變數,其作用域是全域性。

auto變數,作用域只是當前函式。

關於c語言中auto和register的問題

10樓:匿名使用者

1、auto變數:

函式中的區域性變數,如不專門宣告為static儲存類別,都是動態分配儲存空間的,資料儲存在動態儲存區。在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間。這類區域性變數稱為自動變數。

自動變數用關鍵字auto作儲存類別的宣告。如:

int f(int a)

實際上,關鍵字auto可以省略,auto不寫則隱含確定為」自動儲存類別「,它屬於動態儲存方式。程式中大多數變數屬於自動變數。

2、register變數

一般情況下,變數的值是存放在記憶體中的。當程式中用到哪一個變數的值時,由控制器發出指令將記憶體中該變數的值送到運算器中。經過運算器進行運算,如果需要存數,再從運算器將數送到記憶體存放。

如果有一些變數使用頻繁,則為存取變數的值要花不少時間。為提高執行效率,c語言允許將區域性變數的值放在cpu中的暫存器中,需要用時直接從暫存器取出參加運算,不必再到記憶體中去存取。由於暫存器的存取速度遠高於記憶體的存取速度,因此這樣可以提高執行效率。

這種變數叫做」暫存器變數「,用關鍵字register作宣告。如:

int fac(int n)

register變數的說明:

1)只有區域性自動變數和形式引數可以作為暫存器變數,其他不行。

2)一個計算機系統中的暫存器數目是有限的,不能定義任意多個暫存器變數。不同的系統允許使用的暫存器是不同的,而且對register變數的處理方法也是不同的,有的系統對register變數當作自動變數處理,分配記憶體單元,並不真正把它們存放在暫存器中,有的系統只允許將int、char和指標型變數定義為暫存器變數。

3)區域性靜態變數不能定義為暫存器變數。如:register static int a;是錯誤。

4)當今的優化編譯系統能夠自動識別使用頻繁的變數,從而自動地將這些變數放在暫存器中,而不需要程式設計者指定。因此在實際上用register宣告變數是不必要的。

11樓:匿名使用者

auto,變數分配在棧中,一般用在函式裡,當函式呼叫結束後變數被釋放,不難推出auto是在使用時分配記憶體的。(注意,變數預設為auto方式,比如int a,其實是auto int a)

register,暫存器變數,暫存器是非常寶貴的資源,使用後立即會被釋放,所以也是使用是分配的。(注意,只有對速度要求較高的地方會用register)

static,靜態變數,只有在程式結束後才會被釋放。

希望能幫上忙。

12樓:匿名使用者

c語言中變數型別有:

1、register 暫存器變數,使用cpu暫存器2、static 靜態變數,自定義後一直存在直至程式銷燬3、extern 外部變數,將已存在變數的作用域擴充套件到此處4、atuo 自動變數,在預設情況下為此種變數。

雖然記憶體使用的具體情況不是很清楚,但static和extern兩種型別肯定可以排除,因為static自定義後一直存在,重新定義時內容保持不變;extern本身就是針對已存在的變數。

13樓:幻想祕境

auto變數即自動變數,使用完後會自動釋放,register變數為暫存器變數,暫存器的數量是有限的,程式肯定不能一直佔著

10、c語言中,區域性變數的預設儲存類別為。 (a)auto (b) static (c)register (d)extern

14樓:

c語言:

a,函式內部或語句組內部的區域性變數預設是自動變數,即auto!函式外部定義的變數預設是外部變數,只有static,register才是必須在定義時宣告。

a.auto 自動變數;函式引數,和區域性變數的預設型別

一般省略,這個關鍵字的作用,只是告訴我們,有這樣一個型別。

如果不定義這樣一個關鍵字,就會出現,最經常使用的變數,

其儲存型別是個沒有命名的型別,的尷尬局面。

b.static 靜態變數;有3個層次;

1 )定義在函式外部,檔案層次區域性變數,佔據全域性記憶體的變數。是一種全域性變數

名字是檔案層次可見的。

2)定義在函式內部第1層大括號內部。

函式層次區域性可見,佔據全域性記憶體的變數。

名字是函式內部可見的。

3)定義在 函式內部第n層大括號內部。

第n層語句組或(者叫分程式)層次區域性可見,佔據全域性記憶體的變數。

名字是第n層語句組內部可見的。

c.register 只能是區域性變數;

d.extern 外部變數;全域性變數,函式外部定義的變數,佔據全域性記憶體的變數。

擁有引用可見性,全部可見性,和檔案可見性三種可見性。

檔案內部,自定義處起,具有全部可見性,可以看到變數的一切;

檔案內部,引用宣告處起具有引用可見性,只能看到型別(看不到陣列的大小),

非本檔案定義的變數也是可見的!

檔案可見性,沒有引用宣告的檔案,不可見本檔案定義的外部變數。

這種從沒有引用宣告的外部變數只有本檔案可見!

另外 static,extern 還可以定義函式;

extern 函式的定義和宣告都可以省略extern,也就是extern 是函式的預設儲存型別

static 是不可以省略的!

c語言如何限制變數範圍,C語言如何限制變數範圍?

每個整數都在 10 5 10 5之間,即 100000 100000之間,這裡最大的數是10000,變換成16進位制就是186a0,資料佔用3個位元組 最壞情況下1000個100000相加等於100000000,即16進位制5f5e100,佔用4個位元組 最高位空閒,可用於符號位 假設pc機是32位...

auto在C語言中的意義

c語言中提供了儲存說明 符auto,register,extern,static說明的四種儲存類別。四種儲存類別說明符有兩種儲存期 自動儲存期和靜態儲存期。其中auto和register對應自動儲存期。具有自動儲存期的變數在進入宣告該變數的程式塊是被建立,它在該程式塊活動時存在,退出該程式塊時撤銷。...

C語言關於全域性變數問題50分

因為你的 int pf int x,int n 函式返回的是陣列指標,如果k定義為區域性的話,等函式返回後,k已經銷燬了,所以結果不正確,如果非要定義成區域性的話,那麼用malloc分配記憶體即可。1.加標頭檔案 include 2.在int pf int x,int n 函式中新增int k in...