深入淺出理解局部、全局、靜態、動態、外部變量

1、全部變量、局部變量

局部變量:定義在函數內部的變量,作用域爲函數內部         eg: void fun(){ int x;}

全部變量:只能定義一次,多次引用。作用域爲整個文件。

 

若同一個源文件,全局變量和局部變量重名是,在局部變量的作用域,全部變量不起作用。

 

關鍵詞:

全部變量:函數外定義+全局可見+存放在內存的全局數據區+未初始化的的時候爲0

局部變量:函數內定義+函數內可見+存放在棧區,函數退出變量消失+不顯式初始化內容不可預知

 

2、靜態存儲變量、動態存儲變量

 

靜態存儲變量:程序運行期間永久佔用固定內存的變量+存放在棧區,生命週期爲整個程序

動態存儲變量:根據需要進行臨時動態分配存儲空間的變量+存放在堆區,函數結束後自動釋放

 

所以程序的指令代碼是放在代碼區,靜態存儲變量是放在靜態數據區(比如全局變量),而程序的動態存儲變量是存放在動態數據區(比如函數的形參、函數調用的返回地址)

 

3、靜態局部變量、靜態全局變量、外部變量(extern

 

靜態局部變量:與局部變量的區別是,在函數退出時該變量還是存在但是不能被其他函數使用。當再次進入到該函數的時候可以使用上次保存的結果。可以理解爲把局部變量緩存起來,在原作用域內有效。只被初始化一次,下一次初始化根據上一次的結果值

 

eg:

 

#include<stdio.h>

 

voidfun1(int v){

        static int a = v;

        printf(“%d”,a)

}

 

intmain(){

        fun1(100);

        fun1(200);

}

 

兩次執行的結果都是100,第二次調用時初始化的a是上一次的值,體現了一次存儲

 

靜態全局變量、extern:僅在定義的源文件內有效,靜態全局變量與全局變量的區別就是:全局變量和一再聲明爲外部變量(extern),被其他源文件使用。靜態全局變量就不行了,只能在源文件內使用。

 

任何用static修飾的函數,其作用域僅爲當前源文件,而對外部來說這個函數是不可見的

 

備註:

 

一個程序將操作系統分配給其運行的內存塊分爲4個區域:

1、 代碼區:存放程序各個函數的代碼塊

2、 全局數據區:存放全局數據和靜態數據(一次初始化,多次調用)

3、 堆區:動態數據

4、 棧區:局部數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章