**,功能為了更好地實現模組化程式設計。那麼,什麼是函式的性質?在函式中定義的變數(全域性變數、區域性變數、靜態變數)如何儲存?為什麼範圍和全域性變數和區域性變數的壽命是不一樣的?只是有乙個更深入的了解的功能。能夠回答這些問題!
函式的本質是一段可執行的機器指令**,函式名的本質是乙個標號。表示函式**的入口。該標號的值等於記憶體中儲存函式**的記憶體空間的首位址。
全域性變數也就是外部變數。定義在函式的外部。
因此它不屬於不論什麼乙個函式,僅僅屬於所在的原始檔。
對於全域性變數來說。假設沒有被初始化,其值由編譯器自己主動設定為0。因此,使用乙個全域性變數不用考慮它的初始化問題。
執行結果:
其作用域從定義該變數的這一行開始到定義該變數的原始檔結束,在此期間,全部的函式都能夠引用該變數。這裡有一點要注意:全域性變數作用域的範圍並非從程式的開始一直到程式的結尾,而是從定義這個變數的開始處到程式的結尾。
有這樣一種情況:在乙個原始檔裡,定義全域性變數之前已經定義了乙個函式a。那麼a就不能引用這個全域性變數。假設非要引用這個變數,那麼就先在a之前宣告這個全域性變數。
區域性變數也成為內部變數,它定義在函式或者復合語句的內部。
假設區域性變數未被初始化。那麼直接引用會非常危急。
由於區域性變數儲存於記憶體的堆疊中。
定義了區域性變數之後,編譯器不會將其初始化為0,而是此記憶體空間原來的值。那麼這個值是乙個隨機值。最後就可想而知了。因此。區域性變數一定要記得初始化!
執行結果:
由於它定義在函式內部或者復合語句的內部。因此,其作用域僅限於函式或者符合語句內。
原始檔裡,不同的變數儲存在不同的區域內。
乙個程式在執行期間會占用記憶體,而且記憶體的使用情況也不同。通常會分為:資料段、**段、堆疊段、bss段
●bbs段(block started by symbol)
通經常使用來儲存未初始化全域性變數和靜態變數的一塊區域。bss段屬於靜態記憶體分配。在程式執行之前,bss段會自己主動清零。
這也就是前面全域性變數不用初始化的原因。
●**段
用來存放程式的執行**。這段內存在程式執行之前就已經確定。
●資料段
通經常使用來存放已經初始化的全域性變數和靜態變數。屬於靜態記憶體分配。
●堆
用來存放程式動態分配的記憶體空間。大小不固定。
可擴張、可縮減。當呼叫malloc函式時,就是從堆上分配記憶體。記憶體空間擴大;呼叫free函式時,堆上記憶體空間就會縮減。
●棧
用來存放函式內部定義的區域性變數(注意:不包含static宣告的變數,一般儲存在資料段中)。
在函式被呼叫時。其引數也會被壓入發起呼叫的堆疊中。而且待到呼叫結束後。函式的返回值也會被放會棧中。因為棧的先進後出的特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義來講,我們能夠把堆疊看成乙個寄存、交換暫時資料的記憶體區。
函式的作用是使**模組行增強,有利於**的閱讀和改動,能夠有效的縮減**的體積。
可是函式呼叫是非常費時的,乙個函式呼叫一般有4步:
1、需將引數壓入堆疊
2、須要儲存暫存器的值
3、須要儲存返回位址
4、會造成跳轉
這四步中以上3步都須要訪問記憶體。訪問記憶體是非常消耗時間的。假設程式中呼叫函式過多,其執行的速度肯定會非常慢。因此在程式執行過程中。應該盡量降低不必要的函式呼叫,這樣才幹提高程式的執行速度。
因為區域性變數儲存在棧上,全域性變數儲存在資料段上。
因為兩者的儲存位置不同導致生命週期的不同。
對於程式中呼叫非常高的區域性變數。編譯器會自己主動將其儲存在暫存器中,可是全域性變數不會被儲存在暫存器中。由於全域性變數在整個程式中一直存在。假設全域性變數儲存在暫存器中,那麼暫存器就無法儲存暫時變數或者中間值。
計算機中。暫存器資源本來就稀少,程式的執行效率也不高效率。因此,全域性變數必須儲存在乙個資料段。那就是儲存器。最大限度地減少記憶體訪問還提高程式執行速度的方法。(地處註冊cpu在,它的特徵是:小容量。快。假設一些變數經常使用,在此變數被儲存在暫存器。這將減少記憶體執行頻率,從而節省了時間)
C語言學習 C語言初始
c語言初識 329 個控制語句 名字 作用 1.auto 宣告自動變數 2.static 宣告靜態變數 3.extern 宣告全域性變數 4.register 宣告暫存器變數 5.int 宣告整型變數 6.float 宣告實型變數 7.double 宣告雙精度變數 8.char 宣告字元變數 9.s...
C語言學習
c語言學習 2013 3 26 1 編寫strcat s,t 函式,功能 將t指向的字串複製到s指向的字串的尾部。程式設計思路 1 通過while迴圈找到字串s的結束符。2 從找到的結束符開始將t複製到s,同時移動二者的指標。2 編寫函式strend s,t 如果字串t出現在字串s的尾部,該函式返回...
c語言學習
今天總結一些c 語言方面的知識 變數的概念 其值在作用域內可以改變的量稱為變數。乙個變數應該有乙個名字,並在記憶體中佔據一定儲存空間。區域性變數和全域性變數 區域性變數是在函式內作定義說明的,其作用域僅限函式內,離開該函式再使用這種變數是非法的。全域性變數也稱為外部變數,是在函式外部定義的變數,它不...