C 語言程式設計 作用域和儲存器

2021-10-07 08:37:44 字數 2732 閱讀 1670

所謂作用域(scope),就是變數的有效範圍。c 語言中所有的變數都有自己的作用域,決定變數作用域的是變數的定義位置。

注:區域性變數和全域性變數的名稱可以相同,但是在函式內,如果兩個名字相同,會優先使用區域性變數值,全域性變數不會被使用。

全域性變數與區域性變數在記憶體中的區別:

注:正確地初始化變數是乙個良好的程式設計習慣。

如果需要在乙個原始檔中引用另外乙個原始檔中定義的變數,我們只需在引用的原始檔中將變數加上 extern 關鍵字的宣告即可。如下例:

#include

extern

int x;

extern

int y;

intaddtwonum()

#include

int x=1;

int y=1;

intaddtwonum()

;int

main()

執行

$ gcc -wall main.c addtwonum.c -o main

$ ./main

result : 2

注意,因為 c 語言**是從前往後依次執行的,所以全域性變數通常位於原始檔的頂部。

int a, b;

//全域性變數

void

func1()

float x,y;

//全域性變數

intfunc2()

intmain()

a、b、x、y 都是在函式外部定義的全域性變數。由於 x、y 定義在函式 func1() 之後,所以在 func1() 內無效;而 a、b 定義在源程式的開頭,所以在 func1()、func2() 和 main() 內都有效。

儲存類定義了 c 程式中的變數/函式的作用域和生命週期,通過特殊的修飾符(關鍵字)來進行修飾不同的變數/函式,使得他們具有靈活的作用域。下面列出 c 程式中可用的儲存類:

auto 儲存類是所有區域性變數預設的儲存類。auto 只能用在函式內,即 auto 只能用於修飾區域性變數。

下述例項定義了兩個具有相同儲存類的變數:

register 儲存類用於定義儲存在暫存器中而不是記憶體中的區域性變數。這意味著變數的最大 size 等於暫存器的 size,且不能對它應用一元運算子 『&』 (因為它沒有記憶體空間)。

暫存器只用於需要快速訪問的變數,比如:計數器。還應注意的是,使用了 register 修飾符進行修復並不意味著變數將被儲存在暫存器中,它意味著變數可能儲存在暫存器中,這取決於硬體和實現的限制。

被 static 修飾的變數和常量被稱為靜態變數靜態常量

修飾函式,表明函式的作用範圍,僅在定義該函式的檔案內才能使用。在多人開發專案時,為了防止與他人命名空間裡的函式重名,可以將函式定位為 static。

#include

/* 函式宣告 */

void

func1

(void);

static

int count=10;

/* 全域性變數 - static 是預設的 */

intmain()

return0;

}void

func1

(void

)

執行:

$ ./main

thingy 6, count 9

thingy 7, count 8

thingy 8, count 7

thingy 9, count 6

thingy 10, count 5

thingy 11, count 4

thingy 12, count 3

thingy 13, count 2

thingy 14, count 1

thingy 15, count 0

可見,靜態變數 thingy 不會在每次函式呼叫時重置。

extern 儲存類用於提供乙個全域性變數/函式的引用。全域性變數/函式的作用域是整個程式,當你在乙個原始檔中想引用另外一些原始檔中定義的全域性變數/函式時,你可以在該原始檔中使用 extern 修飾符,修飾乙個全域性變數/函式,而且不需要進行初始化(因為該全域性變數實際上在另乙個原始檔中已經完成了初始化)。

簡而言之,extern 修飾符就是用與在乙個檔案中,對另外乙個完全中的全域性變數或函式進行宣告(但不定義),向編譯器保證該變數/函式的存在(即便變數/函式的定義並不在本檔案中)。

#include

int count ;

extern

void

write_extern()

;int

main()

#include

extern

int count;

void

write_extern

(void

)

C語言儲存方式和作用域 1

只有完全了解每個變數或函式儲存方式 作用範圍和銷毀時間才可能正確的使用程式語言。基礎紮實才是硬道理。在c語言中變數從作用範圍分為 1.全域性變數 定在所有函式外部的定義的變數,定義後所有的函式中均可以使用,只要前面的 修改了,那麼後面的 中再使用就是修改後的值。ps 在專案中,一般有兩到三處,我一般...

C語言儲存方式和作用域(3)

前面講了,static和extern對函式的作用,static用來定義乙個內部函式,不允許其他檔案訪問 extern用來定義和宣告乙個外部函式,允許其他檔案訪問。statuc和extern對變數也有作用,不過跟函式有點差別。1.預設情況下,乙個函式不可以訪問再它後面定義對全域性變數。int main...

程式語言的靜態作用域和動態作用域

首先我們看一段程式 include stdio.h intx 5 usr bin perl subf subg x,y,z top top top f print at top after f x x,y y,z z 程式的輸出結果 in f after g x f,y g,z g at top a...