變數的作用域與可見性

2021-10-19 10:54:24 字數 2572 閱讀 4378

1.基本概念

變數有資料型別: char/unsigned char/short/unsigned short/int/unsigned int long/unsigned long/ float/double

定義變數 int a = 100;//自動分配4位元組的記憶體空間,其中儲存100

2.從作用域與可見性的角度來分類

全域性變數:函式之外定義的變數屬於全域性變數

區域性變數:函式內部定義的變數屬於區域性變數

形參變數也是區域性變數

3.特點

區域性變數

1)作用域:只在其定義的函式內部有效

2)生命週期

隨著函式被呼叫,而分配區域性變數對應記憶體空間(生)

隨著函式呼叫結束,區域性變數對應的記憶體空間也收回(死)

全域性變數

1)作用域

全域性有效(所有函式中都可以使用)

2)生命週期

隨著程式的啟動,全域性變數就分配了對應的記憶體空間(生)

隨著程式的結束,全域性變數對應的記憶體空間才**(死)

需要注意的事項:

1)如果區域性變數和全域性變數重名了,函式內部會優先使用區域性變數

2)區域性變數的作用域與生命週期的引申

區域性變數的生命始於

作用域,定義該區域性變數的之中

3)全域性變數 只定義不初始化,系統會自動將其對應的記憶體空間初始化為0

區域性變數 只定義不初始化,其對應的記憶體空間中的記憶體不可預知

4.關鍵字static //靜態的

可以使用它來修飾區域性變數

全域性變數

函式被static修飾的全域性變數,稱作靜態全域性變數

被static修飾的區域性變數,稱作靜態區域性變數

4.1 被static修飾的區域性變數

int f(void)

靜態區域性變數,其作用域和普通的區域性變數作用域相同就是函式內部 (內部)

其生命週期始於程式開始執行,結束於程式結束 (全域性變數的生命週期相同)

總結:static修飾區域性變數 作用域不變  拉長了區域性變數的生命週期    

4.2 被static修飾的全域性變數

mkdir static

cd static

vim main.c

#include extern int g_a;

int main(void)

vim func.c

#include int g_a = 100;// 全域性變數

void func(void)

gcc main.c func.c

./a.out //程式正常執行

修改func.c

vim func.c

int g_a = 100;// 全域性變數 替換為

static int g_a = 100;

gcc main.c func.c //報錯 認為找不到變數g_a

通過以上實驗:

static 修飾全域性變數 使得全域性變數不再是全域性(所有的.c)可見的

縮小為值在本檔案中可見

總結:

作用域(可見性) 生命週期

區域性變數 函式內部(內部) 隨著函式呼叫的開始()而結束

靜態區域性變數 函式內部(內部) 隨著程式的啟動而開始

隨著程式的結束而結束

(static拉長了區域性變數的生命週期)

全域性變數 全域性可見(所有.c中可見) 隨著程式的啟動而開始

隨著程式的結束而結束

靜態全域性變數 只在定義該變數的.c中可見 隨著程式的啟動而開始

其它.c檔案中不可見 隨著程式的結束而結束

(static縮小了全域性變數的

可見性)

4.3 static修飾函式

vi main.c

extern void func(void); //func的宣告

int main()             

gcc main.c func.c

./a.out

static修飾函式的作用類似於修飾全域性變數

使得該函式只在定義的.c檔案中見,

其它.c檔案不可用

vi func.c

把 void func(void)替換為

static void func(void)

gcc main.c func.c //報錯 被staic修飾的函式在其它.c檔案中不可見

筆試題:談談對static關鍵字的理解?

修飾區域性變數 。。。

修飾全域性變數 。。。

修飾函式…

5.extern關鍵字

int g_a; //定義乙個全域性變數 意味著要分配4位元組的記憶體空間

extern int g_a;//宣告乙個全域性變數 告訴編譯器已經存在乙個變數叫g_a

//不需要編譯器再去分配記憶體空間了

//該**的主要目的就是告訴編譯器後邊再分析到g_a,

//你編譯器知道它是乙個int型別的變數就好了

C 中 作用域及可見性

作用域是用來表示某個識別符號在什麼範圍內有效,可見性是指識別符號是否可見,可引用。1.作用域 作用域是這樣乙個區域,識別符號在程式的這個區域內是有效的。c 的作用域主要有四種 函式原型作用域 塊作用域 類作用域和檔案作用域。a.函式原型作用域 函式原型大家還記得嗎?比如 void fun int x...

note C 作用域 可見性與生存期

作用域是乙個識別符號 變數 常量 函式等 在程式正文中有效的區域。函式原型作用域 區域性作用域 塊作用域 類作用域 全域性作用域 檔案作用域 命名空間作用域。即參數列。函式原型中的引數,其作用域始於 結束於 例 double area double radius 區域性作用域舉例 void fun ...

go 函式的作用域及可見性

比如 test.go 中 我們定義 了 a 作為全域性變數,那麼在這個程式中任何地方都可以呼叫a,這個 var a int 100 func add a int,b int int package main import fmt zhangyue res listen6 可見性 func main ...