標籤:
原文連結:http://blog.csdn.net/pirateleo/article/details/7529776
一、static
關鍵字static,修飾變數時:
1、限制該變數的範圍:比如靜態全域變數,只能在該模組中使用(本c檔案中)。
2、決定該變數的儲存位置:修飾為靜態變數,儲存在待用資料區(非堆棧內)。(同比,全域變數也都存放在待用資料區中。)
帶初值和不帶初值的靜態變數:(以TI DSP 54XX為例)
a.不帶初值的靜態變數,儲存在.bss段中。
b.帶初值的靜態變數,儲存在.bss段中,但其初值儲存在.init中。在DSP Booter完成載入初始化後已經將init段的值賦值到.bss對應變數中。
關鍵字static,修飾函數時:限制該函數的範圍,僅能在本模組中使用(本c檔案中)。
結論:static關鍵字對於使用者而言,最重要的是對變數或函數範圍的限制。
二、const
關鍵字const意味著“不變的”:
1、什麼時候該用:定義一個函數時如果在輸入參數前加上const,可以防止該輸入變數被改寫而引出的錯誤;函數定義時使用const可以起到函數API自注釋作用;
2、怎麼用:
以下摘錄經典面試題中的例子:
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是一個常整型數。
第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。
第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。
最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。
三、volatile
關鍵字volatile意味著“易改變的”:
修飾為volatile的變數,編譯器不會對其進行任何最佳化,每次求值時會到指定地址(物理或映射)去讀取。因此適用於“平行裝置的硬體寄存器(如:狀態寄存器) ;一個中斷服務子程式中會訪問到的非自動變數(Non-automatic variables) ;多線程應用中被幾個任務共用的變數 ”,我個人只用到在IO和中斷中,至於多線程的問題有個文章可供參考。
http://www.soft-bin.com/html/2010/07/30/concurrent-multithread-code-problem-and-volatile-and-atomic-opration.html
四、堆與棧(heap and stack)
1) 堆是由使用者維護的。比如我們malloc一段空間,此時開闢的空間便在堆中,調用free時再釋放。過於頻繁的malloc與free會導致堆中產生片段(一個空間的地址不連續),影響讀寫速度。
2) 棧是由編譯器控制的,我們無需幹涉。比如我們定義的局部變數或是調用了一個函數。以函數調用為例,此時系統會將現場資料(主要是部分寄存器中的資料,如PC的儲存可以在調用結束時程式迴歸此處繼續運行)壓入棧內,將寄存器空出迎接被調函數中的一系列計算和控制。被調函數執行完後再進行出棧操作,流程繼續。
【轉】嵌入式C語言那點事(一)幾個重要關鍵字