static的本質:
static 是定義靜態變數用的,在程式執行中他只會被初始化一次。
靜態變數的實質是:靜態儲存方式,其儲存空間為記憶體中的靜態資料區
1、先來介紹它的第一條也是最重要的一條:隱藏。
當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。
為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。
下面是a.c的內容
char a = 'a'; // global variable
void msg()
下面是main.c的內容
extern char a; // extern variable must be declared before use
int main(void)
程式的執行結果是:
a hello
為什麼在a.c中定義的全域性變數a和函式msg能在main.c中使用?前面說過,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。此例中,a是全域性變數,msg是函式,並且都沒有加static字首,因此對於另外的原始檔main.c是可見的。
如果加了static,就會對其它原始檔隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。static可以用作函式和變數的字首,對於函式來講,static的作用僅限於隱藏,而對於變數,static還有下面兩個作用。
2、static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。雖然這種用法不常見,但我還是舉乙個例子。
int fun(void)
修飾區域性變數
static修飾區域性變數時,使得被修飾的變數成為靜態變數,儲存在靜態區。儲存在靜態區的資料生命週期與程式相同,在main函式之前初始化,在程式退出時銷毀。(無論是區域性靜態還是全域性靜態)
修飾全域性變數
全域性變數本來就儲存在靜態區,因此static並不能改變其儲存位置。但是,static限制了其鏈結屬性。被static修飾的全域性變數只能被該包含該定義的檔案訪問(即改變了作用域)。
3、static的第三個作用是預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。比如初始化乙個稀疏矩陣,我們可以乙個乙個地把所有元素都置0,然後把不是0的幾個元素賦值。如果定義成靜態的,就省去了一開始置0的操作。再比如要把乙個字元陣列當字串來用,但又覺得每次在字元陣列末尾加'\ 0'太麻煩。如果把字串定義成靜態的,就省去了這個麻煩,因為那裡本來就是'\0'。
C語言常見問題總結
1.用 注釋 在c語言中不是好辦法,尤其是在注釋的 中原先已經有注釋存在,可能會報錯,更好的辦法是用 if 和 endif 2.如果有一些宣告需要用於幾個不同的原始檔,可以在乙個單獨的檔案編寫這些宣告,然後用 include命令把這個檔案包含到需要使用這些宣告的原始檔中 3.標準的c編譯器不會對陣列...
C 面試常見問題
1.引用和指標的區別 區別 1 引用不能為空,指標可以為空 2 引用必須初始化,指標不需要 3 引用初始化以後不能改變,指標可以改變初始化物件後的值 4 引用訪問物件後是直接訪問,指標訪問物件是間接訪問 5 引用大小是所引用物件的大小,指標大小是指標類本身的大小 6 引用沒有const,指標有con...
C 面試常見問題
智慧型指標的作用是管理乙個指標,因為存在以下這種情況 申請的空間在函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標就是乙個類,當超出了類的作用域是,類會自動呼叫析構函式,析構函式會自動釋放資源。所以智慧型指標的作用原理就是在函式結束時自動釋放記憶體空間,...