C語言中的四種存儲類别: 自動變量 (auto)、靜态變量(static)、寄存器(register)、外部變量 (extern)。
1. 自動變量
通常在自定義函數内或代碼段中(用“{}”括起來的)定義的變量,都是自動變量,除了加了static關鍵字修飾的變量,也稱為局部變量。都是動态地配置設定存儲空間的,資料存儲在動态存儲區中。函數中的形參和在函數中定義的變量(包括在複合語句中定義的變量)都屬此類,在調用該函 數時系統會給它們配置設定存儲空間,在函數調用結束時就自動釋放這些存儲空間。
自動變量用關鍵字 auto 進行存儲類别的聲明,例如聲明一個自動變量:
int fun(int a)
{
/*定義 b,c 為自動變量*/
auto int b,c=3;
}
//a 是函數 fun()的形參,b、c 是自動變量,并對 c 賦初值 3。
//執行完 fun()函數後,自動釋放 a、b、c 所占的存儲單元。
2. 外部變量
外部變量(即全局變量)是在函數的外部定義的,它的作用域為從變量定義處開始,到本程式檔案的末尾。
#include <stdio.h>
void fun(void);
int a = 100; //定義一個全局變量
int main(void)
{
//我們可以直接使用變量a
printf("a = %d\n",a);
//可以改變a的值
a = 10;
printf("a = %d\n",a);
//可以在函數中使用變量a
fun();
return 0;
}
void fun(void)
{
printf("a = %d\n",a);
}
如果外部變量不在檔案的開頭定義,其有效的作用範圍隻限于定義處到檔案末尾。如果在定義點之前的函數想引用該外部變量,則應該在引用之前用關鍵字 extern 對該變量進行“外部變量聲明”。表示該 變量是一個已經定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量.
//我們在外部建立一個C檔案
int w = 100;//定義一個整型變量
void fun(void)//定義一個函數
{
printf("這是外部函數!\n");
}
我們如何和拿到外部檔案個變量呢?很簡單,可以通過extern關鍵字來進行聲明
#include <stdio.h>
//通過關鍵字extern來聲明外部變量,然後我們就可以在本檔案可以使用了,前提是變量或函數是公開的
extern int w;
//通過關鍵字extern來聲明外部函數,而在通常情況下函數的聲明可以省略關鍵字extern
extern void fun(void);
int main(void)
{
//我們可以獲得外部變量的值
printf("w = %d",w);
//同樣我們可以調用外部的函數
fun();
rerurn 0;
}
通過舉例,顯而易見,我們可以用 extern 聲明外部變量,達到擴充程式檔案中的作用域效果。
3. 靜态變量
有時希望函數中的局部變量的值在函數調用結束後不消失而保留原值,這時就應該指定局部變量為靜态局部變量,用關鍵字 static 進行聲明。
#include <stdio.h>
void fun(void);
int main(void)
{
int a;
fun();
fun();
return 0;
}
void fun(void)
{
//前面我們說過,這是自動變量,在這個fun()函數結束之後,将被釋放
int x=100;
//如果在定義自動存儲變量,前面加上關鍵字static,那麼它就變成靜态變量,在函數結束後,将被保留
static int y = 50;
//我們可以驗證一下,通過調用兩次函數列印出x和y的值,觀察結果
y +=10;
printf("x = %d,y = %d\n",x,y);
}
我們調用兩次該函數,可以得到結果 : x的值不變,y的值加上了10;
4. 寄存器變量
為提高效率,C 語言允許将局部變量的值存放在 CPU 的寄存器中,這種變量叫做寄存器變量,用關鍵字 register 聲明。使用寄存器變量需要注意以下幾點:
(1)隻有局部自動變量和形式參數可以作為寄存器變量。
(2)一個計算機系統中的寄存器數目有限,不能定義任意多個寄存器變量。
(3)不能使用取位址運算符“&”求寄存器變量的位址。
相關概念
作用域(scope)
概念:作用域描述了程式中合法通路一個辨別符的區域。
一個C變量的作用域可以是:
- 代碼塊作用域(block scope)
- 函數原型作用域(function prototype scope)
- 檔案作用域(file scope)
連結(linkage)
概念:跟作用域類似,變量的連結是一個空間概念,描述了程式中合法通路一個辨別符的區域。
一個C變量的連結類型可以是:
- 外部連結(external linkage)
- 内部連結(internal linkage)
- 空連結(no linkage)
存儲期(storage duration)
概念:變量的聲明周期,描述了一個C變量在程式執行期間的存在時間。
一個C變量的存儲期可以是:
- 靜态存儲期(static storage duration)
- 自動存儲期(automatic storage duration)
- 動态存儲期(dynamic storage duration)
存儲類說明符:
1、auto:聲明一個自動變量
2、static:聲明一個靜态變量,或聲明一個内部連結函數和全局變量
3、register:聲明一個寄存器存儲類變量
4、extern:聲明一個外部存儲變量
5、typedef:文法意義上的存儲類,與實際存儲類型無關。