C語言 作用域
類型 |
作用域 |
生命周期 |
auto變量 |
一對{}內 |
當前函數 |
static局部變量 |
一對{}內 |
整個程序運行期 |
extern變量 |
整個程序 |
整個程序運行期 |
static全局變量 |
當前文件 |
整個程序運行期 |
extern函數 |
整個程序 |
整個程序運行期 |
static函數 |
當前文件 |
整個程序運行期 |
register變量 |
一對{}內 |
當前函數 |
局部變量與全局變量
一、變量作用域
C語言變量的作用域分為:
- 代碼塊作用域(代碼塊是{}之間的一段代碼)
- 函數作用域
- 文件作用域
二、局部變量
1、說明
局部變量也叫auto自動變量(auto可寫可不寫),一般情況下代碼塊{}內部定義的變量都是自動變量,它有如下特點:
- 在一個函數內定義,只在函數范圍內有效
- 在復合語句中定義,只在復合語句中有效
- 隨着函數調用的結束或復合語句的結束局部變量的聲明聲明周期也結束
- 如果沒有賦初值,內容為隨機
2、案例

#include <stdio.h> void test() { //auto寫不寫是一樣的 //auto只能出現在{}內部 auto int b = 10; } int main(void) { //b = 100; //err, 在main作用域中沒有b if (1) { //在復合語句中定義,只在復合語句中有效 int a = 10; printf("a = %d\n", a); } //a = 10; //err離開if()的復合語句,a已經不存在 return 0; }

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> void fun01(int a) { return 0; } int main(void) { // 局部變量 // 定義變量:局部變量 在函數內部定義的變量 使用auto修飾、棧區存儲 // 作用域:在函數內部 // 生命周期:從創建到函數結束 // 局部變量未初始化,值為亂碼 auto int a = 10; printf("%d\n", a); // 局部變量I,只限於for循環使用 for (int i = 0; i < 10; i++) { break; } return 0; }
三、全局變量
1、說明
- 在函數外定義,可被本文件及其它文件中的函數所共用,若其它文件中的函數調用此變量,須用extern聲明
- 全局變量的生命周期和程序運行周期一樣
- 不同文件的全局變量不可重名
2、案例

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> // 全局變量 // 全局變量、在函數外部定義的變量、存儲數據區、可以和局部變量重名 // 作用域:整個項目中所有文件、如果在其他文件中使用 需要聲明 extern // 生命周期:從程序創建到程序銷毀 // 全局變量未初始化、值為0 extern int a = 10; int main(void) { printf("%d\n", a); int a = 123; // 匿名內部函數、執行完銷毀 { int a = 123456; printf("%d\n", a); } // 數據在操作時會采用就近原則 printf("%d\n", a); return 0; }
四、靜態(static)局部變量
1、說明
- static局部變量的作用域也是在定義的函數內有效
- static局部變量的生命周期和程序運行周期一樣,同時staitc局部變量的值只初始化一次,但可以賦值多次
- static局部變量若未賦以初值,則由系統自動賦值:數值型變量自動賦初值0,字符型變量賦空字符
2、案例

#include <stdio.h> void fun1() { int i = 0; i++; printf("i = %d\n", i); } void fun2() { //靜態局部變量,沒有賦值,系統賦值為0,而且只會初始化一次 static int a; a++; printf("a = %d\n", a); } int main(void) { fun1(); fun1(); fun2(); fun2(); return 0; }

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> void fun04() { // 靜態局部變量 // 靜態局部變量只會初始化一次,可以多次賦值 // 正常局部變量函數執行完后會被銷毀 // 在數據區進行存儲 // 作用域:只能在函數中使用 // 生命周期:從程序創建到程序銷毀 // 靜態局部變量未初始化、值為0 static int b = 10; b++; printf("%d\n", b); } int main(void) { for (int i = 0; i < 10; i++) { fun04(); } return 0; }
五、靜態(static)全局變量
1、說明
- 在函數外定義,作用范圍被限制在所定義的文件中
- 不同文件靜態全局變量可以重名,但作用域不沖突
- static全局變量的生命周期和程序運行周期一樣,同時staitc全局變量的值只初始化一次
2、案例

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> // 靜態全局變量 // 作用域:可以在本文件中使用、不可以在其他文件中使用 // 生命周期:程序創建到程序銷毀 // 靜態全局變量未初始化、值為0 static int c = 10; int main(void) { printf("%d\n", c); return 0; }
六、extern全局變量聲明
聲明一個變量,這個變量在別的文件中已經定義了,這里只是聲明,而不是定義。
extern int a;
靜態函數與全局函數
一、函數作用域
在C語言中函數默認都是全局的,使用關鍵字static可以將函數聲明為靜態,函數定義為static就意味着這個函數只能在定義這個函數的文件中使用,在其他文件中不能調用,即使在其他文件中聲明這個函數都沒用。對於不同文件中的staitc函數名字可以相同。
注意:
- 允許在不同的函數中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾。
- 同一源文件中,允許全局變量和局部變量同名,在局部變量的作用域內,全局變量不起作用。
- 所有的函數默認都是全局的,意味着所有的函數都不能重名,但如果是staitc函數,那么作用域是文件級的,所以不同的文件static函數名是可以相同的。
二、全局函數案例

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> // 全局函數 // 添加函數聲名 void fun03(); // 函數可以調用自己、稱為遞歸函數 int main(void) { // 全局函數名稱是作用域中唯一的 // 作用域:在整個項目中所有文件中使用 // 存儲區域:代碼區 fun03(); return 0; }
三、靜態函數案例

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> // 靜態函數 // 作用域:當前文件中 // 靜態函數可以和全局函數重名 // 生命周期:重程序創建到程序銷毀 // 存儲區域:代碼區 static void fun03() { printf("%d\n", 10); } int main(void) { fun03(); return 0; }