static、auto、register、extern

變量從作用域角度觀察,可分爲全局變量局部變量,而從變量存在時間來觀察則分爲靜態存儲方式動態存儲方式

內存中供用戶使用的存儲空間可分爲三部分:

  • 程序區

  • 靜態存儲區 :全局變量

  • 動態存儲區:函數形式參數、函數中定義的沒有static關鍵字的聲明變量、函數調用時的現場保護和返回地址

C中的存儲類別分爲4種:

  • 自動的、

  • 靜態的、

  • 寄存器、

  • 外部的、


1.自動變量

在函數內部如果不專門聲明static(靜態)存儲類別,都是動態地分配存儲空間,數據存儲在動態存儲區中

  int f(int a)
  {
   auto int b,c=3;//等價於int b,c=3;
  }

2.靜態局部變量(static 局部變量)

我們在函數內部定義的變量都是動態的,當函數執行完畢之後就會被系統回收掉,但有時根據需求,某個變量的值不能被回收,這裏有需要加入static局部變量,加上之後這個變量直到程序結束後纔會被釋放掉,這種形式在就是階乘時經常用到。

    int fac(int n);

     int i;

  for (i=1; i<=5; i++) {

    printf("%d!=%d\n",i,fac(i));

    }
        int fac(int n)
    {
    static int f=1;
    f=f*n;
    return (f);
    }

3.寄存器變量(register)

在過去機器運算低下的情況下,爲提高運算效率允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器中去取,不必再到內存中去取。對寄存器的存取速度遠高於對內存的存取速度,這種變量叫做寄存器變量。現在一般都比怎麼用。

4.全局變量

全局變量的生命週期是到程序結束,但作用範圍卻根據在哪裏申請而受到限制,主要分爲兩種情況:

  • 在一個文件內

    int main(int argc, const char * argv[]) {
    
            extern A;
            printf("%d",A);
            return 0;
    }
        int A=10;
    

    我們在main函數下邊申請了一個變量A,按照從上到下的順序,我們不能夠在main函數裏面調用變量A,但引入extern關鍵字我們就可以實現。

  • 在兩個文件間

    file1文件

    int A=10;
    int main()
    {
        print();
        return 0;
    }
    

    file2文件

    extern A;
    int print()
    {
        int print=A;
        return (A);
    }
    

倘若我們不想讓別的文件引入我們的變量我們可以在變量前面加上static,這樣就不會出現兩個文件間進行互用一個變量了。

我們對static做個總結:

(1)對局部變量用static聲明,是爲了把它分配在靜態存儲區,程序執行過程中分配的空間不釋放,

(2)對於全局變量用static聲明,作用是讓變量作用域只限於本文件模塊中

發佈了134 篇原創文章 · 獲贊 184 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章