1. 程式人生 > >C語言入門(廿一)之static、extern關鍵字

C語言入門(廿一)之static、extern關鍵字

區域性變數


 概念: 區域性變數就是定義在函式, 程式碼塊和函式形參列表中的變數, 我們就稱之為區域性變數
 作用範圍: 從定義的那一行開始一直直到遇到大括號結束或者遇到return為止


 特點:
    相同作用域範圍內不能出現同名的區域性變數
    不同作用域範圍內出現同名的區域性變數, 內部的區域性變數會覆蓋外部的區域性變數


注意:
    區域性變數沒有固定的初始化值, 如果沒有對區域性變數進行初始化, 那麼區域性變數中是一些隨機的值, 所以在開發中千萬不要使用未初始化的區域性變數
 儲存位置:
    區域性變數儲存在棧中, 當作用域結束系統會自動釋放棧中的區域性變數
 

 全域性變數


 概念: 寫在函式,程式碼塊,形參列表外的變數, 我們就稱之為全域性變數
 作用範圍: 從定義的那一行開始一直直到檔案末尾(暫時這樣認為)


 特點:
    全域性變數和區域性變數可以同名
    如果存在和全域性變數同名的區域性變數, 那麼區域性變數會覆蓋全域性變數


注意:
    全域性變數如果沒有進行初始化, 那麼系統預設會將全域性變數初始化為0
 儲存位置:
    全域性變數儲存在靜態區中, 他會隨著程式的啟動而建立, 隨著程式的結束而結束

 

全域性變數分為兩種:


 1.外部全域性變數, 預設情況下所有的全域性變數都是外部全域性變數
    什麼事外部全域性變數? 可以被其它檔案訪問的全域性變數我們稱之為外部全域性變數
 2.內部全域性變數, 只要給全域性變數加上static關鍵字就是內部全域性變數
    什麼是內部全域性變數? 只能被當前檔案訪問的全域性變數我們稱之為內部全域性變數
 
 外部全域性變數有一個特點:
    可以定義同名的外部全域性變數
    多個同名的外部全域性變數指向同一塊儲存空間


 
 內部全域性變數有一個特點
    也可以定義多個同名的內部全域性變數
    多個同名的全域性變數如果不在同一個檔案中, 那麼指向不同的儲存空間
 
 
 為了提高資料的安全性, 不讓別人在其它檔案中修改我們的全域性變數, C語言提供了另外一個用於修改全域性變數的關鍵字, static
 只要用static修改的全域性變數就是內部全域性變數, 只能在當前檔案中使用
 這樣就可以提高我們全域性變數的安全性

 
 如果多個檔案中存在同名的內部全域性變數, 相互不會影響
 如果既有外部全域性變數也有內部全域性變數, 那麼會優先訪問內部全域性變數
 
 
 extern:
    用於宣告一個外部全域性變數
    宣告只需要在使用變數之前宣告就可以了


 static:
    用於定義一個內部全域性變數


 宣告和定義的區別:
    宣告不會開闢儲存空間
    定義會開闢儲存空間

 

如果直接在zs.c當中定義外部全域性變數num, 那麼我們說過同名的外部全域性變數指向同一塊儲存空間,
那麼如果在多個檔案中有同名的外部全域性變數, 可能導致A檔案的資料被B檔案不小心修改了。
降低了資料的封裝性, 提高了發生錯誤的概率。

extern關鍵字用來修飾全域性變數, 代表宣告一個全域性變數
注意: 宣告全域性變數和宣告函式一樣, 僅僅是告訴系統我們有這個全域性變數, 但並不會真在的開闢儲存空間 

當使用static來修飾區域性變數, 那麼會延長區域性變數的生命週期, 並且會更改區域性變數儲存的位置 , 將區域性變數從棧轉移到靜態區中。
只要使用static修改區域性變數之後, 當執行到定義區域性變數的程式碼就會分配儲存空間, 但是隻有程式結束才會釋放該儲存空間。

static關鍵字修飾函式

函式也分為內部函式和外部函式
 預設情況下所有的函式都是外部函式
 什麼是外部函式? 可以被其它檔案訪問的函式稱之為外部函式
 什麼是內部函式? 只能在當前檔案中範文的函式稱之為內部函式

總結:

函式和變數定義在main函式的外部,預設都是外部檔案可訪問的,加上static修飾,可以限定檔案內訪問