參考:
C存儲(chǔ)類-菜鳥教程
C語言register關(guān)鍵字—最快的關(guān)鍵字
c primer plus 6th edition
C作用域規(guī)則
變量
作用域是程序中定義的變量所存在的區(qū)域内颗,超過該區(qū)域變量就不能被訪問。
- 在函數(shù)內(nèi)部或塊內(nèi)部的局部變量
在某個(gè)函數(shù)或塊的內(nèi)部聲明的變量稱為局部變量。它們只能被函數(shù)或該代碼內(nèi)部的語句使用咕宿。
局部變量在函數(shù)外部是不可知的。下面是使用局部變量的實(shí)例叫搁。在這里匈仗,所有的變量 a、b 和 c 是 main() 函數(shù)的局部變量悍手。
#include
int main ()
{
/* 局部變量聲明 */
int a, b;
int c;
/* 實(shí)際初始化 */
a = 10;
b = 20;
c = a + b;
printf ("value of a = %d, b = %d and c = %dn", a, b, c);
return 0;
}
- 在所有函數(shù)外部的全局變量
全局變量是定義在函數(shù)外部帘睦,通常是在程序的頂部。全局變量在整個(gè)程序生命周期內(nèi)都是有效的谓苟,在任意的函數(shù)內(nèi)部能訪問全局變量官脓。
全局變量可以被任何函數(shù)訪問。也就是說涝焙,全局變量在聲明后整個(gè)程序都可以用卑笨。
#include<stdio.h>
/* 全局變量 */
int g;
int main(){
return 0;
}
在程序中,局部變量和全局變量的名稱可以相同仑撞,但是在函數(shù)內(nèi)赤兴,局部變量的值會(huì)覆蓋全局變量的值妖滔。
#include
/* 全局變量聲明 */
int g = 20;
int main ()
{
/* 局部變量聲明 */
int g = 10;
printf ("value of g = %dn", g);
return 0;
}
運(yùn)行結(jié)果是:
value of g = 10
- 在形式參數(shù)的函數(shù)參數(shù)定義中
函數(shù)的參數(shù),形式參數(shù)桶良,被當(dāng)作該函數(shù)內(nèi)的局部變量座舍,它們會(huì)優(yōu)先覆蓋全局變量。
作用域
一個(gè)C變量的作用域可以是塊作用域陨帆,函數(shù)作用域曲秉,函數(shù)原型作用域或文件作用域。
- 塊作用域
塊是一對(duì)花括號(hào)括起來的代碼區(qū)域疲牵。
我們使用的局部變量都具有塊作用域承二。
double blocky(double cleo){
double patrick = 0.0;
...
return patrick;
}
函數(shù)作用域
僅用于goto語句的標(biāo)簽。這意味著即使一個(gè)標(biāo)簽首次出現(xiàn)在函數(shù)的內(nèi)層塊中纲爸,它的作用域也延伸至整個(gè)函數(shù)亥鸠。函數(shù)原型作用域
用于函數(shù)原型中的形參名(變量名)
int mighty(int mouse, double large);
函數(shù)原型作用域的范圍是形參定義處到原型聲明結(jié)束。這意味著识啦,編譯器在處理函數(shù)原型中的形參時(shí)只關(guān)心它的類型负蚊。而形參名(如果有的話)通常無關(guān)緊要。文件作用域
定義在函數(shù)的外面的變量具有文件作用域颓哮,具有文件作用域的變量家妆,從它的定義處到改定義所在文件的末尾均可見。
所有文件作用域變量也稱為全局變量题翻。
鏈接
C變量有三種鏈接屬性:外部鏈接揩徊、內(nèi)部鏈接或無鏈接
具有塊作用域、函數(shù)作用域或函數(shù)原型作用域的變量都是無鏈接變量嵌赠。這意味這些變量術(shù)語定義他們的塊塑荒、函數(shù)和原型私有。
具有文件作用域的變量可以是外部鏈接或內(nèi)部鏈接姜挺。外部鏈接變量可以在多文件程序找使用齿税,內(nèi)部鏈接變量只能在一個(gè)翻譯單元中使用。
C存儲(chǔ)類
C程序中的存儲(chǔ)類包括如下:
- auto
- register
- static
- extern
auto
{
int mount;
auto int month;
}
auto存儲(chǔ)類是所有局部變量默認(rèn)的存儲(chǔ)類
auto 只能用在函數(shù)內(nèi)炊豪,即 auto 只能修飾局部變量
register
register 存儲(chǔ)類用于定義存儲(chǔ)在寄存器中而不是 RAM 中的局部變量凌箕。這意味著變量的最大尺寸等于寄存器的大小(通常是一個(gè)詞)词渤,且不能對(duì)它應(yīng)用一元的 '&' 運(yùn)算符(因?yàn)樗鼪]有內(nèi)存位置)牵舱。
{
register int miles;
}
寄存器只用于需要快速訪問的變量,比如計(jì)數(shù)器缺虐。還應(yīng)注意的是芜壁,定義‘register’并不意味著變量將存儲(chǔ)在寄存器中,它意味著變量可能存儲(chǔ)在寄存器中,這取決于硬件和實(shí)現(xiàn)的限制慧妄。
register變量必須是能被CPU寄存器所接受的類型顷牌。意味著register變量必須是一個(gè)單個(gè)的值,并且其長度應(yīng)小于或等于整數(shù)的長度塞淹。
盡量在大量頻繁的操作時(shí)使用寄存器變量窟蓝,且聲明的變量個(gè)數(shù)應(yīng)該盡量的少
static
static 存儲(chǔ)類指示編譯器在程序的生命周期內(nèi)保持局部變量的存在,而不需要在每次它進(jìn)入和離開作用域時(shí)進(jìn)行創(chuàng)建和銷毀饱普。因此运挫,使用 static 修飾局部變量可以在函數(shù)調(diào)用之間保持局部變量的值。
static 修飾符也可以應(yīng)用于全局變量费彼。當(dāng) static 修飾全局變量時(shí)滑臊,會(huì)使變量的作用域限制在聲明它的文件內(nèi)。
static 是全局變量的默認(rèn)存儲(chǔ)類箍铲,以下兩個(gè)變量 (count 和 road) 都有一個(gè) static 存儲(chǔ)類。
static int count;
int road;
main()
{
}
extern 存儲(chǔ)類
extern 存儲(chǔ)類用于提供一個(gè)全局變量的引用鬓椭,全局變量對(duì)所有的程序文件都是可見的颠猴。當(dāng)您使用 'extern' 時(shí),對(duì)于無法初始化的變量小染,會(huì)把變量名指向一個(gè)之前定義過的存儲(chǔ)位置翘瓮。
當(dāng)您有多個(gè)文件且定義了一個(gè)可以在其他文件中使用的全局變量或函數(shù)時(shí),可以在其他文件中使用 extern 來得到已定義的變量或函數(shù)的引用裤翩∽手眩可以這么理解,extern 是用來在另一個(gè)文件中聲明一個(gè)全局變量或函數(shù)踊赠。