目錄
?前言:
一、幾個(gè)概念
1.變量
2.局部變量和全局變量
3.變量的作用域
4.變量的生命周期
二、static關(guān)鍵字的作用
三、static關(guān)鍵字修飾局部變量
四、static關(guān)鍵字修飾全局變量
?五、static關(guān)鍵字修飾函數(shù)
?寫在最后:
?前言:
? ? ? ? ? ?static,英文意思靜態(tài)的,作為C語(yǔ)言常用關(guān)鍵字中一個(gè)很重要的關(guān)鍵字,其用法多樣且比較難以理解。
一、幾個(gè)概念
? ? ? ? ?首先,介紹幾個(gè)與static關(guān)鍵字用法有關(guān)的重要概念,便于后面知識(shí)的更好理解。
1.變量
? ?變量:C語(yǔ)言中可變化的值用變量來(lái)表示
變量的命名規(guī)則:
(1)只能由字母(包括大寫和小寫)、數(shù)字和下劃線(_)組成
(2)不能以數(shù)字開頭
(3)長(zhǎng)度不超過(guò)63個(gè)字符
(4)變量名區(qū)分大小寫
(5)變量名不能使用關(guān)鍵字
2.局部變量和全局變量
? ?這里展示一段代碼示例。
#include<stdio.h>
int a = 2020;//全局變量
int main()
{
int b = 2021;//局部變量
int a = 2023;//局部變量
printf("a = %d", a);
return 0;
}
總結(jié):
局部變量:定義在函數(shù)體內(nèi)部的變量,只能在函數(shù)體內(nèi)部使用。
全局變量:定義在函數(shù)體外部的變量,在整個(gè)程序中都可以使用。?
? ? ? ?我們?cè)倏悼瞪厦孢@段代碼會(huì)發(fā)現(xiàn),變量a既為全局變量又為局部變量,即出現(xiàn)了局部變量和全局變量同名的情況,輸出變量a,運(yùn)行結(jié)果如下:
?總結(jié):允許局部變量和全局變量同名,且同名的時(shí)候,局部變量?jī)?yōu)先使用。
3.變量的作用域
? ?作用域:一段程序代碼中所用到的名字并不總是有效或者可用,而限定這個(gè)名字可用性的代碼范圍就是這個(gè)名字的作用域。
(1)局部變量的作用域是變量所在的局部范圍。
(2)全局變量的作用域是整個(gè)工程。
4.變量的生命周期
變量的生命周期:變量的創(chuàng)建到變量的銷毀之間的一個(gè)時(shí)間段。
(1)局部變量的生命周期:進(jìn)入作用域生命周期開始,出作用域生命周期結(jié)束。
(2)全局變量的生命周期:整個(gè)程序的生命周期。
二、static關(guān)鍵字的作用
? ? ? ?在C語(yǔ)言中,static關(guān)鍵字是用來(lái)修飾變量和函數(shù)的。
? ? ? ?1.修飾局部變量(稱為靜態(tài)局部變量)
? ? ? ?2.修飾全局變量(稱為靜態(tài)全局變量)
? ? ? ?3.修飾函數(shù)(稱為靜態(tài)函數(shù))
三、static關(guān)鍵字修飾局部變量
? ? ? ?我們?nèi)匀幌日故疽欢问纠a:
#include<stdio.h>
void text()
{
int a = 0;
a++;
printf("%d ", a);
}
int main()
{
int i= 0;
for (i= 0; i < 10; i++)
{
text();
}
return 0;
}
? ? ?main函數(shù)中使用for循環(huán),將text函數(shù)循環(huán)十次。代碼中變量a作為局部變量,text函數(shù)中a初始值為0,a++后a的值為1,打印輸出1,a每次循環(huán)進(jìn)入text函數(shù)創(chuàng)建,出text函數(shù)銷毀。故程序最后運(yùn)行結(jié)果為10個(gè)1。
我們用static修飾text函數(shù)中的局部變量a,代碼如下:
#include<stdio.h>
void text()
{
static int a = 0;
a++;
printf("%d ", a);
}
int main()
{
int i= 0;
for (i= 0; i < 10; i++)
{
text();
}
return 0;
}
運(yùn)行結(jié)果如下:
?
? ? ? ?我們可以發(fā)現(xiàn),當(dāng)static修飾局部變量a時(shí),程序運(yùn)行結(jié)果為1到10。由運(yùn)行結(jié)果分析,當(dāng)static修飾局部變量a后,變量a在text函數(shù)中進(jìn)入后創(chuàng)建,出函數(shù)并未后銷毀,而是保留了上一次循環(huán)a出text函數(shù)后的值繼續(xù)作用,即局部變量a被static關(guān)鍵字修飾后,作用域不變,生命周期變長(zhǎng)了。
? ? ? 本質(zhì)上來(lái)講的話,需要簡(jiǎn)單了解以下知識(shí)。
? ? ? 內(nèi)存可分為棧區(qū)、堆區(qū)、靜態(tài)區(qū)(也可稱為全局區(qū))等。棧區(qū)存放函數(shù)的參數(shù)值、局部變量的值等,這些數(shù)據(jù)進(jìn)入作用域創(chuàng)建,出作用域被銷毀。堆區(qū)用于動(dòng)態(tài)內(nèi)存分配等。靜態(tài)區(qū)存儲(chǔ)全局變量和靜態(tài)變量,這些變量創(chuàng)建好后,直到程序結(jié)束后才釋放。
總結(jié):
(1)static關(guān)鍵字修飾局部變量不改變作用域,但是生命周期變長(zhǎng)。
(2)本質(zhì)上,static關(guān)鍵字修飾局部變量,改變了局部變量的存儲(chǔ)位置,因?yàn)榇鎯?chǔ)位置的差異,使得執(zhí)行效果不一樣。普通的局部變量放在棧區(qū),這種局部變量進(jìn)入作用域創(chuàng)建,出作用域釋放。局部變量被static修飾后成為靜態(tài)局部變量,這種變量放在靜態(tài)區(qū),創(chuàng)建好后,直到程序結(jié)束后才釋放。
四、static關(guān)鍵字修飾全局變量
? ? ? ?首先展示代碼,我們?cè)谕粋€(gè)工程中創(chuàng)建兩個(gè)源文件,在左邊源文件中定義全局變量a的值,在右邊源文件中使用關(guān)鍵字extern,聲明外部變量a。
? ? ? ? 在右邊源文件中打印輸出a的值為2022,運(yùn)行結(jié)果如下:
若用static關(guān)鍵字修飾左邊源文件里的全局變量a,再次運(yùn)行右邊源文件,運(yùn)行結(jié)果出錯(cuò):
?總結(jié):
(1)全局變量本身具有外部鏈接屬性,可使用extern關(guān)鍵字聲明外部文件變量,實(shí)現(xiàn)跨文件變量使用。但是如果全局變量被static關(guān)鍵字修飾后,這個(gè)外部鏈接屬性就變成了內(nèi)部鏈接屬性,全局變量作用域變小,全局變量只能在自己所在的源文件內(nèi)部使用。
(2)static關(guān)鍵字修飾全局變量,不改變生命周期,作用域變小。
?五、static關(guān)鍵字修飾函數(shù)
? ? ? ?static關(guān)鍵字修飾函數(shù)與修飾全局變量相似,我們?cè)谕粋€(gè)工程中創(chuàng)建兩個(gè)源文件,在左邊源文件中定義函數(shù)max,在右邊源文件中使用關(guān)鍵字extern,聲明外部函數(shù)max。
? ? ? ?在右邊源文件中打印輸出max的值為2,運(yùn)行結(jié)果如下:
? ? ? ?若用static關(guān)鍵字修飾左邊源文件里的函數(shù)max,再次運(yùn)行右邊源文件,運(yùn)行結(jié)果出錯(cuò):
?總結(jié):函數(shù)本身具有外部鏈接屬性,可使用extern關(guān)鍵字聲明外部文件函數(shù),實(shí)現(xiàn)跨文件函數(shù)使用。但是如果函數(shù)被static關(guān)鍵字修飾后,函數(shù)只能在自己所在的源文件內(nèi)部使用,不能在其他源文件內(nèi)使用。
?寫在最后:
? ? ? ?我們可以使用static關(guān)鍵字修飾變量或者函數(shù)防止被誤引用,如果不是對(duì)外提供的全局變量和函數(shù),最好都用static關(guān)鍵字修飾,保證數(shù)據(jù)安全。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-774157.html
? ? ? ?我們下次見(jiàn)咯~~~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-774157.html
到了這里,關(guān)于C語(yǔ)言之static關(guān)鍵字詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!