1. 程式人生 > >C語言中static的含義和用法

C語言中static的含義和用法

———————————–
測試環境:linux
開發語言:c
編譯工具:gcc
———————————–

static
顧名思義是靜態、靜止的意思 個人理解的含義是私有、靜態

私有就是隱藏->
1.static函式只能聲明後的本文中呼叫
2.static全域性變數只能聲明後的本文中呼叫
3.static區域性變數只能聲明後的本函式呼叫
靜態就是一直存在,相對於每次呼叫動態分配而言->
1.static函式(未驗證是否每次呼叫程式碼地址都是一致的)
2.static全域性變數生命週期到程式或程序結束;
3.static區域性變數生命週期到程式或程序結束;

c語言中static可以用來修飾變數和函式,像以下例子:
1.修飾函式

#include <stdio.h>
static void FunFir(){   // static 修飾函式FunFir()
    printf("print from static void FunFir!\n");
}
int main(){
    FunFir();
}

2.修飾全域性變數

#include <stdio.h>
static int num = 0; /* static 修飾全域性變數num */
void FunFir(){
    printf("print from FunFir %d \n", num);
    num++;
    printf
("print from FunFir after ++ %d \n", num); } int main(){ num += 25; printf("print from main %d \n", num); FunFir(); printf("print from main after FunFir %d \n", num); num -= 1; printf("print from main after -1 %d \n", num); }

3.修飾區域性變數

#include <stdio.h>
void FunFir(){
    static
int num = 0; //static修飾區域性變數num printf("print from FunFir %d \n", num); num++; printf("print from FunFir after ++ %d \n", num); } int main(){ int i = 0; for(;i<10;i++){ printf("print from main [%d] times\n", i); FunFir(); } }

其中對函式、全域性變數的修飾強調私有性,就是說這個函式、變數只在這個檔案中有效(從宣告的地方到檔案結束)
對區域性變數的修飾是指這個變數在這段程式碼載入到記憶體到失效這段時間內它的值是不隨函式呼叫結束而改變的

關於作用域
1.static函式

/* 程式碼檔案開始 */
// ...
static void FunA()      //----開始----
//...                   //     |    
int FunB(){             //     |
    //...               //     |
}                       //----結束----

// 從函式宣告開始,到這段程式碼檔案結束,都可以呼叫這個函式。
// 宣告前、其他程式碼檔案中不能呼叫該函式。
/* 程式碼檔案結束 */

2.static全域性變數

/* 程式碼段開始 */
static int num = 0;     //-----開始------
void FunA(){            //      |
    //...               //      |
}                       //      |
int FunB(){             //      |
    //...               //      |
}                       //-----結束------
// 從變數宣告開始,到這段程式碼檔案結束,都可以呼叫這個變數。
// 可以被重新初始化、賦值。
/* 程式碼段結束 */

3.static區域性變數

/* 程式碼段開始 */
void FunA(){
    static int num = 0; //-----開始------
    //...               //      |
}                       //-----結束------
int FunB(){
    //...
}                       
// 從變數宣告開始,到該函式結束,都可以呼叫這個變數。
// 可以被重新初始化、賦值。
// 變數值儲存在靜態儲存器,直到程式結束才會回收。
// 其他函式不能訪問這個變數
/* 程式碼段結束 */

關於記憶體佈局

  1. 全域性靜態變數
    記憶體中的位置:靜態儲存區(靜態儲存區在整個程式執行期間都存在)
    初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
  2. 區域性靜態變數
    記憶體中的位置:靜態儲存區
    初始化:未經初始化的區域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初始化)
    3Static修飾的函式
    在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。
    函式的定義和宣告預設情況下是extern的,但靜態函式只是在宣告他的檔案中可見,不能被其他檔案所用。
    總結
    static可以用作函式和變數的字首,對於函式來講,static的作用僅限於隱藏,而對於變數,static還有下面兩個作用。
    1.static可以保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。
    2.static變數預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。