做用域:一個變量或者函數起做用的範圍函數
生命週期:一個變量何時被釋放spa
static關鍵字:修飾局部變量、修飾全局變量、修飾函數code
局部變量的做用域是離他最近的一個代碼塊,好比函數體的大括號、if for while循環體的代碼塊。超出這個代碼塊則沒法訪問。blog
1 #include<stdio.h> 2 int all; 3 int main() 4 { 5 6 if(1) 7 { 8 int a = 10; //a 的做用域就是第7-9行 9 } 10 printf("%d\n",a);//沒法訪問a 11 12 test(); 13 } 14 15 void test() 16 { 17 int b = 6; //b 的做用域就是第17-20行 18 printf("%d\n",b); 19 20 }
全局變量的做用域爲整個程序,若是在main.c定義了一個全局變量,若是在其餘c文件使用這個全局變量則使用extern 聲明便可生命週期
如上面程序中a的生命週期是理他最近的一個函數,main函數結束,a被釋放。作用域
如上面程序中b的聲明週期是離他最近的一個函數,test函數結束,b被釋放。釋放的意思就是該變量定義在棧上,函數被調用結束,則屬於函數的棧被收回。io
整個程序結束,全局變量all纔會被釋放class
整個程序全部c文件均可訪問test
當使用static關鍵字修飾局部變量、修飾全局變量、修飾函數時,他們的做用域和生命週期恢復發生一些改變。(函數的生命週期不變,都是伴隨整個程序)變量
1 #include<stdio.h> 2 static int all;//靜態全局變量 3 4 static void test()//靜態函數 5 { 6 int b = 6; 7 printf("%d\n",b); 8 9 } 10 int main() 11 { 12 13 if(1) 14 { 15 static int a = 10; //靜態局部變量 16 } 17 printf("%d\n",a);//沒法訪問a 18 19 test(); 20 } 21
做用域不變,生命週期擴大伴隨整個程序
做用域縮小爲當前c文件可見。生命週期伴隨整個程序
做用域縮小爲當前c文件