C 儲存類


儲存類別定義 C 程式中變數/函數的範圍(可見性)和生命週期。這些說明符放置在它們所修飾的類型之前。以下列出C 程式中可用的儲存類別:

  • auto

  • #register

  • ##static

  • extern

auto 儲存類別

auto 儲存類別是所有局部變數預設的儲存類別。

{   int mount;   auto int month;}

上面的實例定義了兩個具有相同儲存類別的變量,auto 只能用在函數內,即 auto 只能修飾局部變數。

register 儲存類別

register 儲存類別用於定義儲存在暫存器中而不是 RAM 中的局部變數。這意味著變數的最大尺寸等於暫存器的大小(通常是一個單字),並且不能對它應用一元的 '&' 運算子(因為它沒有記憶體位置)。

{   register int  miles;}

暫存器只用於需要快速存取的變量,例如計數器。還應注意的是,定義 'register' 並不意味著變數將被儲存在暫存器中,它意味著變數可能儲存在暫存器中,這取決於硬體和實現的限制。

static 儲存類別

static 儲存類別指示編譯器在程式的生命週期內保持局部變數的存在,而不需要在每次它進入和離開作用域時進行建立和銷毀。因此,使用 static 修飾局部變數可以在函數呼叫之間保持局部變數的值。

static 修飾符也可以套用於全域變數。當 static 修飾全域變數時,會使變數的作用域限制在宣告它的檔案內。

在 C 程式設計中,當 static 用在類別資料成員上時,會導致僅有一個該成員的副本被類別的所有物件共用。

#include <stdio.h> /* 函数声明 */void func(void); static int count = 5; /* 全局变量 */
 main(){   while(count--)   {
      func();   }   return 0;}/* 函数定义 */void func( void ){   static int i = 5; /* 局部静态变量 */
   i++;

   printf("i is %d and count is %d\n", i, count);}

可能您現在還無法理解這個實例,因為我已經使用了函數和全域變量,這兩個概念目前為止還沒進行解說。即使您現在不能完全理解,也沒有關係,後續的章節我們會詳細講解。當上面的程式碼被編譯和執行時,它會產生下列結果:

i is 6 and count is 4i is 7 and count is 3i is 8 and count is 2i is 9 and count is 1i is 10 and count is 0

extern 儲存類別

extern 儲存類別用於提供一個全域變數的引用,全域變數對所有的程式文件都是可見的。當您使用 'extern' 時,對於無法初始化的變量,會將變數名稱指向一個先前定義過的儲存位置。

當您有多個檔案且定義了一個可以在其他檔案中使用的全域變數或函數時,可以在其他檔案中使用extern 來得到已定義的變數或函數的引用。可以這麼理解,extern 是用來在另一個檔案中宣告一個全域變數或函數。

extern 修飾符通常用於當有兩個或多個檔案共用相同的全域變數或函數的時候,如下所示:

第一個檔案:main. c

#include <stdio.h> int count ;extern void write_extern();
 main(){
   count = 5;
   write_extern();}

第二個檔案:support.c

#include <stdio.h> extern int count; void write_extern(void){
   printf("count is %d\n", count);}

在這裡,第二個檔案中的extern 關鍵字用於宣告已經在第一個檔案main.c 中定義的count。現在,編譯這兩個文件,如下所示:

 $gcc main.c support.c

這會產生a.out 可執行程序,當程式執行時,它會產生下列結果:

5