只有完全了解每個變數或函式儲存方式、作用範圍和銷毀時間才可能正確的使用程式語言。基礎紮實才是硬道理。
在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區域性變數全部存放在靜態儲存區,從定義開始占用記憶體一直到本檔案結束釋放記憶體,存放在靜態儲存區的區域性變數並不隨...