C語言中的四種儲存型別

2021-08-01 08:40:16 字數 3126 閱讀 3774

**:

一、 首先來說說資料的型別,所有的資料都有兩種型別,一是常見的資料型別,如int,float等,一種便是今天的重頭戲,儲存型別。總共有四種儲存型別的變數,分別為自動變數(auto)、靜態變數(static)、外部變數(extern)以及暫存器變數(register)。

先回顧一下定義

1、自動變數:函式中所有的非靜態區域性變數。

2、靜態變數:在變數前加上static關鍵字的變數。

3、外部變數:一般用作全域性變數作用域的擴充套件(還有定義外部函式的時候前面也可以有乙個extern關鍵字,具體外部函式請看下面)。

4、暫存器變數:一般經常被使用的的變數(如某一變數需要計算幾千次)可以設定成暫存器變數,register變數會被儲存在暫存器中,計算速度遠快於存在記憶體中的非register變數。

二、儲存變數關乎著變數的作用域和生存時間

1、從作用域(空間)的角度來看:

自動變數:其作用域僅僅侷限於其定義的函式中,儲存在動態儲存區,注意儲存在動態儲存區的資料,在沒有顯式初始化的時候,其變數的值是隨機的,無用的。

靜態變數:儲存在靜態儲存區,靜態變數包括靜態全域性變數和靜態區域性變數,靜態變數在沒有顯式初始化的時候會被初始化為0或者null,並且只初始化一次(初始化不等同於賦值)。

靜態全域性(外)變數:作用域只是在其定義的原始檔中有效,對外部變數起到了「遮蔽」的作用。

靜態區域性變數:其作用域是其定義的函式中。

外部變數:把全域性變數在其他原始檔中宣告成extern變數,可以擴充套件該全域性變數的作用域至宣告的那個檔案,其本質作用就是對全域性變數作用域的擴充套件。

暫存器變數:儲存在cpu的暫存器中,速度快,一般不需要程式設計師定義暫存器變數,這是由於一些編譯器會把需要參加很多次計算的變數轉化成暫存器變數,不允許程式設計師對暫存器變數的位址進行操作。

2、從生存時間的角度來看:

自動變數:隨著函式的進棧和出棧而建立和銷毀

靜態變數:長期存在靜態儲存區,直到程式結束

外部變數:長期存在靜態儲存區,直到程式結束

暫存器變數:離開函式值就會消失

前面已經介紹了,從變數的作用域(即從空間)角度來分,可以分為全域性變數和區域性變數。

從另乙個角度,從變數值存在的作時間(即生存期)角度來分,可以分為

靜態儲存方式

和動態儲存方式。

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

程式區;

靜態儲存區;

動態儲存區。

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

動態儲存區存放以下資料:

函式形式引數;

自動變數(未加static宣告的區域性變數);

函式呼叫實的現場保護和返回位址。

對以上這些資料,在函式開始呼叫時分配動態儲存空間,函式結束時釋放這些空間。

在c語言中,每個變數和函式有兩個屬性:資料型別和資料的儲存類別。

函式中的區域性變數,如不專門宣告為static儲存類別,都是動態地分配儲存空間的,資料儲存在動態儲存區中。

函式中的形參和在函式中定義的變數(包括在復合語句中定義的變數),都屬此類,在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間。

這類區域性變數稱為自動變數。自動變數用關鍵字auto作儲存類別的宣告。

例如:

intf(

int a)

a是形參,b,c是自動變數,對c賦初值3。執行完f函式後,自動釋放a,b,c所佔的儲存單元。

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

有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為「靜態區域性變數」,用關鍵字static進行宣告。

【例8-15】考察靜態區域性變數的值。

#include

intf

(int a)

intmain

(void

)

對靜態區域性變數的說明:

靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,佔動態儲存空間,函式呼叫結束後即釋放。

靜態區域性變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。

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

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

#include

intfac

(int n)

intmain

(void

)

為了提高效率,c語言允許將區域性變數得值放在cpu中的暫存器中,這種變數叫「暫存器變數」,用關鍵字register作宣告。

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

#include

intfac

(int n)

intmain

(void

)

對暫存器變數的幾點說明:外部變數(即全域性變數)是在函式的外部定義的,它的作用域為從變數定義處開始,到本程式檔案的末尾。如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到檔案終了。

如果在定義點之前的函式想引用該外部變數,則應該在引用之前用關鍵字extern對該變數作「外部變數宣告」。

表示該變數是乙個已經定義的外部變數。有了此宣告,就可以從「宣告」處起,合法地使用該外部變數。

【例8-18】用extern宣告外部變數,擴充套件程式檔案中的作用域。

#include

intmax

(int x,

int y)

intmain

(void

)int a=

13, b=-8;

說明:在本程式檔案的最後1行定義了外部變數a、b,但由於外部變數定義的位置在函式main之後,因此本來在main函式中不能引用外部變數a、b。現在我們在main函式中用extern對a和b進行「外部變數宣告」,就可以從「宣告」處起,合法地使用該外部變數a和b。

C語言中的四種常量

說明 常量在c語言中是不能被改變的量 1.字面常量 例如 整數 1,2,4,34,小數 3.14等。2.const修飾的常變數 變數被const修飾後會具有常量不可被修改的屬性,但其本質依然是乙個變數 define crt secure no warnings 1 include include i...

C語言中的四種作用域

c語言編譯器可以確認四種不同型別的作用域 一.塊作用域。在k r c中,函式形參的作用域始於形參的宣告處,位於函式體之外如果函式體內部宣告了名字相同的區域性變數,他們就將隱藏起來 ansi c遏止了這種錯誤的可能性,它把形參的作用域設定為整個函式體。二.檔案作用域。任何在 塊之外宣告的識別符號都具有...

C語言中的四種常量詳解

目錄 1.字面常量 100 整型常量 3.14 浮點常量 abfdj 字串型常量 w 字元型常量 int a 100 其中的100也是常量,此處需注意,中的數字必須是常量,後面我們會用到這個 const修飾的變數具有常量的某些特徵,其中最主要的特徵就是const修飾的變數不可被改變,但注意,被con...