天天看點

C 語言四大存儲類型。。。

       1。 extern, 從其英文意思外部的就能看出,這個表示引用一個外部變量。。

         C語言程式編譯時是以每個.c 檔案為機關的,最後再把它們連結在一起,是以每個檔案中的全局變量對于其他檔案是可見的,是以可以在一個檔案中引用其他檔案中的變量和函數。

         extern 關鍵字就是用來表示引用别的單元的變量。。。

       比如。。file1.c 中

       int main()

       {

           extern int c ;  //引用外部變量。。。

           exten int sum(int a, int b);

           scanf("%d",&c);

           printf("%d ",c);

      }

     在   file2.c中

       int  c ;

          ====================================================================================

       是以 file1.c可以用其他變量。。

       如果 file2.c 中并沒有定義變量c ,那麼此用法将是錯誤的。。

       同理,函數也可以用此方式。。

       如果外部檔案中的全局變量定義為 static ,則也不能extern操作。

     2  。。 static

     上文提到了static

      static  有兩重功能, 第一是修飾全局變量,和函數,這樣的效果是其他檔案不能引用static修飾了的變量和函數。

      比如:

       file1.c

       int main()

       {

          extern  int a ;  // 引用錯誤

         extern int sum(int ,int )  // 錯誤。。

         .....

        } 

       file2.c

       static int a;

       static int sum(int a, int b);

       是以。。

        static 的第一個功能是當其修飾全部變量和函數時,能限定變量和函數的作用域在此檔案,而不被其他檔案所見。

       第二。  當static 修飾局部變量時。。

        衆所周知,函數中局部變量是自動配置設定在棧中的,當函數結束時會自動銷毀棧中的資料。。

       如果用static 修飾時:

        int  fun( )

        {

             static int count  = 0;

             return count ++;

        }

       int main()

             {

                     int  i;

                    for (i = 0; i<10 ; i++)

                    fun();

       }

      由于 fun()中的  count 為static修飾。 是以它被配置設定在記憶體中的靜态存儲區, 而不是棧中, 是以它的生命周期伴随着整個程式而不是函數,它不會随着函數的結束而銷毀, 但是在函數外部也不能引用它,隻能在每次進入函數後操作。

       每次for 循環時,count 會 自加1 。。。

        靜态局部變量隻初始化一次,如果沒有初始化,那麼會自動初始化為0 。。

        因為記憶體中的靜态存儲區會被自動初始化為 0;

        是以可以 static char str[100] ;

         這時str 被初始化為0,而不用去手動初始化,這也是一種方法。。

         static  和 auto 變量是不同的。 

      3   。    auto  變量

       C語言中預設的資料存儲類型都是auto 變量,即自由變量,它在定義的位置被自動任意配置設定到記憶體中 ,是以當到它的作用域之外時,會自動被OS 銷毀。。

       注意: 全部變量不是auto 型,它是在靜态存儲區的。。

        一個變量不能同時用 static 和 auto 修飾,比如  static auto int a ;

       這樣定義是互相沖突的。。

      是以 對于 auto 變量, 必須在使用時初始化, 或者賦給值,否則它的值是無效值。

    4      register  

          rigister 為寄存器變量,  由于某些資料CPU 要經常讀取,為了讀取快捷,編譯器會把這些資料放寄存器中,而不放在記憶體中,這樣CPU 便可以直接從其寄存器中讀取資料。。

           但是  寄存器的數量畢竟有限,并不是所有定義的register變量都存儲在寄存器中 。。

           register 變量的資料類型必須符合cpu寄存器支援的資料類型 ,一般為整型和浮點型,現在的CPU寄存器也基本支援浮點型。

          register 變量的資料長度必須小于等于寄存器所支援的最大資料長度。

          register 變量有可能沒有存儲在記憶體中, 是以不要用& 取其位址。

          現在的CPU 速度已足夠運算了,是以register變量已經過時了 ,盡量不用。

繼續閱讀