網(wǎng)站建設(shè)的售后seo優(yōu)化服務(wù)是什么
C語言中static的用法(超級詳細(xì)版)
static是C語言中的關(guān)鍵字。
static是靜態(tài)的意思,可以用來:
1.修飾局部變量
2.修飾全局變量
3.修飾函數(shù)
在學(xué)習(xí)static之前,我們要先了解一下作用域和生命周期。
作用域和生命周期
作?域(scope)是程序設(shè)計(jì)概念,通常來說,?段程序代碼中所?到的名字并不總是有效(可?)的,?限定這個(gè)名字的可?性的代碼范圍就是這個(gè)名字的作?域。
- 局部變量的作?域是變量所在的局部范圍。
- 全局變量的作?域是整個(gè)?程(項(xiàng)?)。
?命周期指的是變量的創(chuàng)建(申請內(nèi)存)到變量的銷毀(收回內(nèi)存)之間的?個(gè)時(shí)間段。
- 局部變量的?命周期是:進(jìn)?作?域變量創(chuàng)建,?命周期開始,出作?域?命周期結(jié)束。
- 全局變量的?命周期是:整個(gè)程序的?命周期。
下面舉一個(gè)簡單的例子解釋一下局部變量和全局變量的作用域、生命周期。
#include<stdio.h>
int a =1;//a為全局變量,a的作用域是整個(gè)程序,a的生命周期為整個(gè)程序的生命周期
int main()
{if (a > 0) {int c = 200;//創(chuàng)建局部變量c,生命周期開始printf("%d", c);}//{}之間的為局部變量c的作用域,出作?域?命周期結(jié)束else {int b = 100;//創(chuàng)建局部變量bprintf("%d", b);}//{}之間的為局部變量b的作用域,出作?域?命周期結(jié)束return 0;
}
相信大家對作用域和生命周期已經(jīng)有了很好的了解,現(xiàn)在步入正題!
static修飾局部變量
同樣,最開始為大家舉一個(gè)簡單的例子,通過最直觀的代碼了解static。
#include<stdio.h>void test()
{int a = 0;//每一次進(jìn)入test函數(shù),a都會被重新賦值a++;//由于test函數(shù)沒有返回值,所以a++的計(jì)算對主函數(shù)的循環(huán)沒有影響printf("%d", a);
}
int main()
{int a = 0;for (a = 0; a < 5; a++){test();}return 0;
}
上述代碼的test函數(shù)中的局部變量a是每次進(jìn)?test函數(shù)先創(chuàng)建變量(?命周期開始)并賦值為0,然后
++,再打印,出函數(shù)的時(shí)候變量?命周期將要結(jié)束(釋放內(nèi)存)。
那么,現(xiàn)在我想要a的值有累加的效果,我應(yīng)該怎樣修改上述代碼呢?
此時(shí)就用到了static。
#include<stdio.h>void test()
{static int a = 0;//直接在int前加上statica++;printf("%d", a);
}
int main()
{int a = 0;for (a = 0; a < 5; a++){test();}return 0;
}
代碼中,我們從輸出結(jié)果來看,i的值有累加的效果,其實(shí)test函數(shù)中的a創(chuàng)建好后,出函數(shù)的時(shí)候是
不會銷毀的,重新進(jìn)?函數(shù)也就不會重新創(chuàng)建變量,直接上次累積的數(shù)值繼續(xù)計(jì)算。
結(jié)論:static修飾局部變量改變了變量的?命周期,?命周期改變的本質(zhì)是改變了變量的存儲類型,本
來?個(gè)局部變量是存儲在內(nèi)存的棧區(qū)的,但是被 static 修飾后存儲到了靜態(tài)區(qū)。存儲在靜態(tài)區(qū)的變
量和全局變量是?樣的,?命周期就和程序的?命周期?樣了,只有程序結(jié)束,變量才銷毀,內(nèi)存才
回收。但是作?域不變的。
static修飾全局變量
本質(zhì)原因是全局變量默認(rèn)是具有外部鏈接屬性的,在外部的?件中想使?,只要適當(dāng)?shù)穆暶骶涂梢允?br /> ?;但是全局變量被 static 修飾之后,外部鏈接屬性就變成了內(nèi)部鏈接屬性,只能在??所在的源
?件內(nèi)部使?了,其他源?件,即使聲明了,也是?法正常使?的。
static修飾函數(shù)
其實(shí) static 修飾函數(shù)和 static 修飾全局變量是?模?樣的,?個(gè)函數(shù)在整個(gè)?程都可以使?,
被static修飾后,只能在本?件內(nèi)部使?,其他?件?法正常的鏈接使?了。
所以static修飾函數(shù)在這里我就不在贅述了,直接上代碼!
最后,希望這篇文章對你有所幫助哦!!!