———————————–
測試環境:linux
開發語言:c
編譯工具:gcc
———————————–
static
顧名思義是靜態、靜止的意思 個人理解的含義是私有、靜態
私有就是隱藏->
1.static函式只能宣告後的本文中呼叫
2.static全域性變數只能宣告後的本文中呼叫
3.static區域性變數只能宣告後的本函式呼叫
靜態就是一直存在,相對於每次呼叫動態分配而言->
1.static函式(未驗證是否每次呼叫**位址都是一致的)
2.static全域性變數生命週期到程式或程序結束;
3.static區域性變數生命週期到程式或程序結束;
c語言中static可以用來修飾變數和函式,像以下例子:
1.修飾函式
2.修飾全域性變數#include
static
void funfir()
int main()
3.修飾區域性變數#include
static int num = 0; /* static 修飾全域性變數num */
void funfir()
int main()
其中對函式、全域性變數的修飾強調私有性,就是說這個函式、變數只在這個檔案中有效(從宣告的地方到檔案結束)#include
void funfir()
int main()
}
對區域性變數的修飾是指這個變數在這段**載入到記憶體到失效這段時間內它的值是不隨函式呼叫結束而改變的
關於作用域
1.static函式
2.static全域性變數/* **檔案開始 */
// ...
static void funa() //----開始----
//... // |
int funb() //----結束----
// 從函式宣告開始,到這段**檔案結束,都可以呼叫這個函式。
// 宣告前、其他**檔案中不能呼叫該函式。
/* **檔案結束 */
3.static區域性變數/* **段開始 */
static int num = 0; //-----開始------
void funa() // |
int funb() //-----結束------
// 從變數宣告開始,到這段**檔案結束,都可以呼叫這個變數。
// 可以被重新初始化、賦值。
/* **段結束 */
關於記憶體布局/* **段開始 */
void funa() //-----結束------
int funb()
// 從變數宣告開始,到該函式結束,都可以呼叫這個變數。
// 可以被重新初始化、賦值。
// 變數值儲存在靜態儲存器,直到程式結束才會**。
// 其他函式不能訪問這個變數
/* **段結束 */
全域性靜態變數
記憶體中的位置:靜態儲存區(靜態儲存區在整個程式執行期間都存在)
初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
區域性靜態變數
記憶體中的位置:靜態儲存區
初始化:未經初始化的區域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
3static修飾的函式
在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。
函式的定義和宣告預設情況下是extern的,但靜態函式只是在宣告他的檔案中可見,不能被其他檔案所用。
總結
static可以用作函式和變數的字首,對於函式來講,static的作用僅限於隱藏,而對於變數,static還有下面兩個作用。
1.static可以保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。
2.static變數預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。
C語言中static和extern
c中的關鍵字extern是用來做變數宣告的,宣告extern關鍵字的全域性變數和全域性函式可以使得它們的作用域得到擴充套件,全域性變數和全域性函式預設是extern所以宣告時我們一般不寫 c中的關鍵字static主要用於修飾普通變數和函式 c 中則主要修飾類的成員變數和函式 不管在c還是c 中sta...
c語言中 的含義
是乙個整體,它是用於指向結構體 c 中的class等含有子資料的指標用來取子資料。換種說法,如果我們在c語言中定義了乙個結構體,然後申明乙個指標指向這個結構體,那麼我們要用指標取出結構體中的資料,就要用到 舉個例子 struct data 定義結構體 struct data p 定義結構體指標 st...
C 語言中的static
static 在c語言中,關鍵字 static 有三個明顯的作用 1 在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。2 在模組內 但在函式體外 乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。3 在模組內,乙個被宣告為靜態的...