C語言中的變量有哪些存儲類型,你還記得嗎?static老手都這樣用。
1、 先來回顧C語言變量
C語言中變量值的存儲位置有兩類:CPU的寄存器和內存。變量存儲類型關係到其存儲位置,除了register型存儲在CPU寄存器中,C語言提供的其它三種存儲類型(auto型、static型、extern型)的變量均存儲在內存中。存儲位置不同,決定了變量的生存期和作用域。
具體變量介紹請見作者的另一篇文章,名為《說一說C語言中的變量存儲類型——「extern」》。
下面我們直接講乾貨,static關鍵字用法。
2、 Static關鍵字用法
C語言中,無論是變量還是函數都可以用static關鍵字來修飾。具體用法我們分別來看。
1) 修飾函數
我們知道函數的聲明(定義)也可以包括存儲類型,但只有extern/static兩種。當函數聲明為extern,說明函數具有外部連結,其它文件可以調用此函數;當函數聲明為static,說明函數是內部連結,即只能在定義函數的文件內部調用函數。當不指明函數存儲類型,則默認該函數具有外部連結。
這種情況適用於多文件編程(大多數程序都是這樣的)。當某個文件中定義的函數不希望被其它源文件調用,就可以把它聲明為static,對其它文件來說該函數不可見。例如,你在file1.c文件中定義了多個函數,如果你不允許函數名為fun2的函數被其它文件的函數調用,只需要將其聲明為static即可,這樣fun2函數隻允許被file1.c中的其它函數調用,其它源文件中的函數無法調用fun2,起到了隱藏的作用。
static int fun2(char c); //內部連結,對外不可見
2) 修飾全局變量
我們知道,全局變量存儲在靜態存儲區,但是它不是靜態變量,它的作用範圍從定義處到所在源文件末尾。但是它對其它源文件都是有效的,只需要通過extern聲明一下即可,詳見作者的另一篇文章《說一說C語言中的變量存儲類型——「extern」》。
但是有些情況下,某些全局變量不想被同程序的其它源文件使用,那麼我們就可以使用static關鍵字聲明一下即可。例如,在file1.c中我們定義的整型全局變量g_a不想被其它源文件中函數使用,只需要在定義g_a時加上static關鍵字修飾。
static int g_a;
這樣g_a對其它源文件比如file2.c是不可見的,當然,file2.c中也可以定義一個同名的靜態全局變量,這是沒有問題的。
3) 修飾局部變量(靜態局部變量)
我們知道,在C語言中,局部變量通常定義在函數內部,編譯時不分配空間,只有函數調用運行階段分配空間,局部變量存儲在動態存儲區,函數調用結束時所佔用空間被收回。對於變量介紹,詳見作者的另一篇文章《說一說C語言中的變量存儲類型——「extern」》。
有時,根據程序需要,我們希望某個局部變量的值一直保持,且每次函數調用時(除第一次調用分配空間外)不再分配空間,直接讀取上次的值。該怎麼做呢?
很簡單,只需要在定義局部變量時,用static修飾。例如,file1.c文件中funx函數定義了一個靜態局部變量t,我們可以如下定義:
Int funx(void)
{
static int t;
其它語句
……
return t;
}
定義之後,t變成了一個靜態局部變量,其存儲在靜態存儲區,與全局變量存儲區域相同。因此,在t被分配空間後,空間是固定的,其生存期直到程序運行結束,而不是所在函數調用結束。
static定義靜態局部變量的另一個好處是,變量被分配空間後,默認初始化值為0。其原因就是靜態局部變量存儲在靜態存儲區,該區域內存中所有字節默認為0x00。
今天留個作業,「如果要在定義某靜態全局變量位置之前使用它,該如何操作呢?」請大家留言回答,謝謝!
好了,關於static的用法今天就總結到這,如果大家有任何疑問請留言探討。我是「C語言知識傳播者」,志在瞄準C語言,挖掘和總結C語言的難點和痛點,給C語言編程愛好者和本領域從業人員提供參考,我會用心總結C語言知識的點點滴滴,您的關注是我持續創作的動力,請收藏本文、轉發並點讚,希望得到您的持續關注,謝謝!