概述
static的漢語(yǔ)意思是靜態(tài)的,在C語(yǔ)言中static關(guān)鍵字可以用來(lái)修飾局部變量、全局變量和函數(shù)。
在這里給大家補(bǔ)充一個(gè)知識(shí),我們的數(shù)據(jù)在內(nèi)存中存儲(chǔ)時(shí),大概分為3個(gè)區(qū)域。
1.棧區(qū):我們創(chuàng)建的局部變量、形參等一般就存放在這個(gè)區(qū)域,離開(kāi)作用域是會(huì)自動(dòng)銷毀,將空間還給操作系統(tǒng)。
2.堆區(qū):堆區(qū)存儲(chǔ)的數(shù)據(jù)一般是由我們程序員自己來(lái)開(kāi)辟的,比如使用malloc、realloc等來(lái)動(dòng)態(tài)開(kāi)辟,這個(gè)區(qū)域的空間需要我們程序員自己釋放,否則就會(huì)造成內(nèi)存泄漏。
3.靜態(tài)區(qū):這里一般存儲(chǔ)的是全局變量和靜態(tài)變量,他是有操作系統(tǒng)創(chuàng)建的,工程結(jié)束后由操作系統(tǒng)回收。
static修飾局部變量
在講這個(gè)之前我們先來(lái)比較兩段代碼:
#include<stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
運(yùn)行結(jié)果為:
再來(lái)看下面這段代碼:
#include<stdio.h>
void test()
{
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
test();
}
return 0;
}
運(yùn)行結(jié)果為:
我們可以看到,這兩段代碼一個(gè)test函數(shù)中的i用了static關(guān)鍵字修飾,一個(gè)沒(méi)有,造成運(yùn)行結(jié)果有這么大的差異,這是為什么呢?
其實(shí)道理很簡(jiǎn)單,static來(lái)修飾局部變量,該變量就變成了靜態(tài)變量,那么它就從原本的棧區(qū)改變到了靜態(tài)區(qū),它不會(huì)隨著函數(shù)的結(jié)束而被銷毀,因此我們就看到了下面的這個(gè)結(jié)果,我們?cè)谶@里可以理解為static修飾局部變量延長(zhǎng)了局部變量的生命周期。
在這里需要注意的是,static修飾的局部變量,在編譯時(shí)已經(jīng)創(chuàng)建了,并不是程序走到這個(gè)位置才創(chuàng)建的。
static修飾全局變量
全局變量具有外部鏈接屬性,就是我們?cè)谝粋€(gè)工程中可以有多個(gè).c文件,在別的文件中定義的全局變量是可以在我們本文件中使用的,我們?cè)谑褂玫臅r(shí)候只需要用exturn聲明一下就可以使用。如:
我們是可以使用另一個(gè).c文件中的全局變量的,但是如果static修飾了這個(gè)全局變量,就使它的外部鏈接屬性變成了內(nèi)部鏈接屬性,這時(shí)我們只能在定義那個(gè)全局變量的文件中使用,在別的文件中就不能使用。
static修飾函數(shù)
static修飾函數(shù)和修飾全局變量非常相似,C語(yǔ)言中函數(shù)也是具有外部鏈接屬性的,用static修飾后,也是使它的外部鏈接屬性變成了內(nèi)部鏈接屬性,這是也只能在定義這個(gè)函數(shù)的.c文件中使用,在別的文件中無(wú)法使用。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-499379.html
今天的分享就到這里了,感謝大家的關(guān)注和支持!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-499379.html
到了這里,關(guān)于【C】static關(guān)鍵字詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!