標籤(空格分隔): c 雙學位高階語言程式設計 c函式
這節課我們要學習以下幾個問題:
編譯器是如何區分不同作用域中的同名變數的呢?
編譯器將它們分配給了不同的位址,所以能夠區分。
程式執行時,編譯器是如何為程式分配記憶體空間的呢?
儲存區分類
記憶體資料分類(線性從上到下)
記憶體低位址端
唯讀儲存區
**區唯讀儲存區
常量儲存區
靜態儲存區
動態儲存區
堆動態儲存區
……動態儲存區
棧記憶體高位址端
變數的儲存型別(就是編譯器為變數分配記憶體的方式)決定了變數的生存期。靜態儲存區中的變數生存期是整個函式,動態儲存區中的變數生存期是定義它的語句塊
儲存區分類
功能唯讀儲存區
存放機器**和常量等唯讀資料
靜態儲存區
存放全域性變數和靜態變數(靜態——初始化發生在程式編譯或鏈結時,程式執行時不發生)
動態儲存區
包括堆和棧,其中,棧用於儲存函式呼叫時的返回位址、函式形參、區域性變數等資訊(動態)——初始化發生在程式呼叫和執行時
c語言有四種變數儲存型別,格式如下
儲存型別 資料型別 變數名
c儲存型別關鍵字有
自動變數是使用最廣泛的變數,所以c語言將其定為了預設型別,就是未宣告儲存型別時,預設定義變數為auto型;靜態變數儲存在靜態儲存區內,,僅僅在程式編譯時初始化一次,如果沒有定義初始化為何值,便初始化為0.不管是靜態區域性變數還是靜態全域性變數,生存期都是整個程式,只是作用域不同而已;外部變數是一種宣告方式,如果全域性變數想在定義點之前或者其他檔案中訪問,就需要將變數宣告(不是定義)為extern型別,告訴編譯器,就像函式的宣告一樣;暫存器變數是將變數儲存在cpu中的暫存器內,這適用於使用頻率較高的變數,能使程式更小、執行速度更快,但是現代編譯器一般都會自動識別轉化合適的變數,使其轉為暫存器變數,提高執行速度,所以一般不需要使用者自己宣告暫存器變數
變數生存期
統計共呼叫counter 函式多少次。count.c檔案 include intmain mycounter.c counter 函式 void counter 函式宣告 void counter 執行結果為 count 1,結果不對。因為counter 函式中的count是區域性變數,自動儲存,每...
靜態生存期和動態生存期
靜態生存期 定義 如果某乙個物件的生存期和程式的執行的生存期一樣,則這個物件具有靜態生存期。關鍵字 static 特點靜態變數不會隨著每次函式的呼叫產生乙個新的副本,也不會隨著函式返回而失效。第n次呼叫函式時,靜態變數的值為第n 1次呼叫的靜態變數的值,依次類推!也就是說靜態變數 第一次賦值有效,也...
export Shell環境和變數生存期
test value export test 這樣的指令碼執行完後,test實際上是不存在的。接著看下面的 test value export test bash 這裡在指令碼最後一行再開乙個子shell,該shell應該是指令碼檔案所在shell的子shell,這個指令碼執行完後,是可以看到tes...