C語言儲存方式和作用域 1

2021-08-20 11:13:59 字數 2500 閱讀 5478

只有完全了解每個變數或函式儲存方式、作用範圍和銷毀時間才可能正確的使用程式語言。基礎紮實才是硬道理。

在c語言中變數從作用範圍分為:

1.全域性變數:定在所有函式外部的定義的變數,定義後所有的函式中均可以使用,只要前面的**修改了,那麼後面的**中再使用就是修改後的值。(ps:在專案中,一般有兩到三處,我一般定義成全域性變數,方便修改,方便維護,不需要乙個乙個修改)。

2.區域性變數:作用範圍一般在乙個函式內部(通常在一對大括號{}內),外面的程式無法訪問它,它卻可以訪問外面的變數。

#includeint a =1;

void changevalue()

int main()

列印結果為: a = 2;

a=2,b=1;

只要修改了a全域性變數,再使用就是被修改後的值.

b是區域性變數

c語言的強大之處在於它能直接操作記憶體(指標),但是要搞懂它的操作方式我們必須要搞懂它的儲存方式.

儲存變數的位置分為:

1.普通記憶體(靜態儲存區)

2.執行時堆疊(動態儲存區)

3.硬體暫存器(動態儲存區)

這幾種儲存效率是從低到高的,它們決定了變數何時建立、何時銷毀以及它的值能保持多久,也就是決定了,變數的生命週期。

額外:其實在c語言中還有兩種儲存區:常量儲存區和**儲存區,分別用於儲存字串常量、使用const修飾的全域性變數以及二進位制函式**

然後再根據儲存位置分為不同變數:

1.靜態變數

2.自動變數

3.暫存器變數

1.定義:靜態變數是儲存在靜態記憶體中的,也就是不屬於堆疊。

2.哪些屬於靜態變數呢?

1.所有的全域性變數都是靜態變數

2.被關鍵字static修飾的區域性變數也就是靜態變數

3.生命週期:靜態變數在程式執行之前建立,在程式執行期間始終存在,直到程式結束.只初始化一次.

#includeint a = 1;

void showmessage()

結果為: a=3,b=2,c=1

a=5,b=3,c=1

全域性變數a在靜態記憶體中,只初始化一次。

雖然b是區域性變數,但是被static修飾,在程式結束前,一直存在,但外部無法訪問。

變數c則第一次執行完就釋放了,第二次執行再次建立。

1.定義:自動變數儲存在堆疊中.

3.生命週期:在程式執行到宣告自動變數的**塊(函式或是在 {})時,自動變數才被建立,**塊(函式或遇到 })執行完畢後就會自動銷毀。如果重複呼叫該**塊(函式),這些自動表變數再次重新建立,再次重新銷毀。

void test(int a,int b)

需要注意的是,上面的自動變數儲存在棧中,其實還可以儲存到堆中.

補充:(看不懂沒關係,往下學習碰到物件導向學習課程,就會懂了)

int main()
malloc分配的空間在邏輯上連續,物理上未必連續;

p必須手動釋放,否則直到程式執行結束它占用的記憶體將一直被占用;

釋放p的過程只是把p指向的空間釋放掉,p中存放的位址並未釋放,需要手動設定為null,否則這將是乙個無用的野指標;

同樣的p也是乙個自動變數,也可以用auto修飾,只是它指向的內容放到堆上(p本身就在棧上.)

簡單來說 c、 len、 p都存在棧,當執行到

p = (char *)malloc(len)  p就儲存在堆上了。

其實目的更早了解堆:

當然儲存自動變數的棧和

堆其實是兩個完全不同的空間(雖然都在執行時有效的空間內):

棧一般是程式自動分配,其儲存結果類似於資料結構中的棧,

先進後出

,程式結束時由編譯器自動釋放;

而堆則是開發人員手動編碼分配,如果不進行手動釋放就只有等到程式執行完作業系統**,其儲存結構類似於鍊錶。

注意:無論自動變數還是靜態變數都在記憶體中,不同之處就是自動變數放在執行時分配的特殊記憶體中。

1.定義:儲存在硬體暫存器中的變數,稱為暫存器變數。暫存器變數比儲存在記憶體中的變數訪問效率更高(

無論自動變數還是靜態變數都在記憶體中,不同之處就是自動變數放在執行時分配的特殊記憶體中

).2.哪些變數是暫存器變數呢:

2.1.被關鍵字

register

修飾的變數都是暫存器變數

2.2.

只有自動變數才可以是暫存器變數

,全域性變數和靜態變數不行。

2.3.暫存器變數

只限於int、char

和指標型別變數

的使用3.

生命週期:因為暫存器變數本身就是自動變數,所以函式中暫存器變數在呼叫該函式時占用暫存器中存放的值,當函式結束時候,暫存器變數消失.

注意:由於計算機中暫存器數目有限,不能使用太多的暫存器變數。如果暫存器使用飽和時,程式將暫存器變數自動轉換為自動變數處理

為了提高運算速度,一般會將一些頻繁使用的自動變數定義為暫存器變數,這樣程式盡可能地為它分配暫存器存放,而不用記憶體。

C語言儲存方式和作用域(3)

前面講了,static和extern對函式的作用,static用來定義乙個內部函式,不允許其他檔案訪問 extern用來定義和宣告乙個外部函式,允許其他檔案訪問。statuc和extern對變數也有作用,不過跟函式有點差別。1.預設情況下,乙個函式不可以訪問再它後面定義對全域性變數。int main...

C 語言程式設計 作用域和儲存器

所謂作用域 scope 就是變數的有效範圍。c 語言中所有的變數都有自己的作用域,決定變數作用域的是變數的定義位置。注 區域性變數和全域性變數的名稱可以相同,但是在函式內,如果兩個名字相同,會優先使用區域性變數值,全域性變數不會被使用。全域性變數與區域性變數在記憶體中的區別 注 正確地初始化變數是乙...

變數的作用域和儲存方式

按作用域可分為 區域性變數 函式級區域性變數,復合語句級區域性變數,這種型別的變數在本函式或本復合語句內有效,在其他範圍內無效。按儲存方式可分為 靜態儲存區儲存 全域性變數和static區域性變數全部存放在靜態儲存區,從定義開始占用記憶體一直到本檔案結束釋放記憶體,存放在靜態儲存區的區域性變數並不隨...