局部變量和全局變量
- 局部變量
- 概念:局部變量就是定義在函數(shù)筒饰,代碼塊和函數(shù)形參列表中的變量,我們稱之為局部變量
- 作用范圍:從定義的那一行開始一直到大括號(hào)或者遇到return為止
- 特點(diǎn)
- 相同作用域范圍內(nèi)不能出現(xiàn)同名的局部變量
- 不同作用域范圍內(nèi)出現(xiàn)同名的局部變量竟纳,內(nèi)部的局部變量會(huì)覆蓋外部的局部變量
- 注意:局部變量沒有固定的初始化值视哑,如果沒有對(duì)局部變量進(jìn)行初始化葬项,那么局部變量中是一些隨機(jī)值闪萄,所以在開發(fā)中
千萬(wàn)不要使用未初始化的局部變量
- 存儲(chǔ)位置:局部變量存儲(chǔ)在棧中梧却,當(dāng)作用域結(jié)束系統(tǒng)會(huì)自動(dòng)釋放棧中的局部變量
- 全局變量
- 概念:寫在函數(shù)、代碼塊败去、形參列表外的變量放航,我們稱之為全局變量
- 特點(diǎn):
- 全局變量和局部變量可以同名
- 如果存在和全局變量同名的局部變量,那么局部變量會(huì)覆蓋全局變量
- 注意
- 如果全局變量沒有進(jìn)行初始化圆裕,那么系統(tǒng)默認(rèn)會(huì)將全局變量初始化為0
- 存儲(chǔ)位置:全局變量存儲(chǔ)在靜態(tài)去中广鳍,他會(huì)隨著程序的啟動(dòng)而創(chuàng)建,隨著程序的結(jié)束而結(jié)束
內(nèi)部全局變量和外部全局變量
-
全局變量分兩種
- 外部全局變量吓妆,默認(rèn)情況下所有的全局變量都是外部全局變量
- 可以被其他文件訪問的全局變量我們稱之為外部全局變量
- 特點(diǎn):
- 可以定義同名的外部全局變量
- 多個(gè)同名的外部全局變量指向同一塊存儲(chǔ)空間
- 內(nèi)部全局變量赊时,只要給全局變量加上
static
關(guān)鍵字就是內(nèi)部全局變量- 只能被當(dāng)前文件訪問的全局變量,我們稱之為內(nèi)部全局變量
- 特點(diǎn):
- 也可以定義多個(gè)同名的內(nèi)部全局變量
- 多個(gè)同名的內(nèi)部全局變量耿战,如果不在同一個(gè)文件中蛋叼,那么指向不同的存儲(chǔ)空間
- 外部全局變量吓妆,默認(rèn)情況下所有的全局變量都是外部全局變量
如果有外部全局變量和內(nèi)部全部變量焊傅,那么會(huì)優(yōu)先訪問內(nèi)部全局變量
-
extern:關(guān)鍵字用來(lái)修飾全局變量剂陡,代表聲明一個(gè)全局變量
- 聲明全局變量和聲明函數(shù)一樣狈涮,僅僅是告訴系統(tǒng)我們有這么一個(gè)全局變量,但是不會(huì)在內(nèi)存中開辟存儲(chǔ)空間
- 聲明只需要在使用變量之前聲明就可以了,別的文件中定義的全部變量鸭栖,可以在另一個(gè)文件中使用extern聲明歌馍,之后就可以使用了
-
static:
- 用于定義一個(gè)內(nèi)部全局變量,聲明不會(huì)開辟存儲(chǔ)空間晕鹊,但是定義會(huì)開辟存儲(chǔ)空間
static對(duì)局部變量的作用
- 當(dāng)用static來(lái)修飾局部變量松却,那么會(huì)延長(zhǎng)局部變量的生命周期,并且會(huì)更改局部變量存儲(chǔ)的位置溅话,將局部變量從棧轉(zhuǎn)移到靜態(tài)區(qū)中
- 只要使用static修飾局部變量晓锻,當(dāng)執(zhí)行到定義局部變量的代碼就會(huì)分配存儲(chǔ)空間,但是只有程序結(jié)束才會(huì)釋放該存儲(chǔ)空間
- 應(yīng)用場(chǎng)景
- 當(dāng)某個(gè)方法的調(diào)用頻露非常高飞几,而該方法中有些變量的值是固定不變的砚哆,使用static修改不變的變量,讓該變只分配一次存儲(chǔ)空間屑墨,這樣可以提高程序的效率和性能
static 和 extern對(duì)函數(shù)的作用(了解)
- 函數(shù)也分為內(nèi)部函數(shù)和外部函數(shù)
- 默認(rèn)情況下所有函數(shù)都是外部函數(shù)
- 外部函數(shù):可以被其他文件訪問的函數(shù)稱之為外部函數(shù)
- 內(nèi)部函數(shù):只能在當(dāng)前文件中訪問的函數(shù)稱之為內(nèi)部函數(shù)
// 聲明內(nèi)部函數(shù)一般用于內(nèi)部函數(shù)定義在后面躁锁,而在定義之前想使用函數(shù)
static void sum();
int main(int argc, const char * argv[]) {
sum();
return 0;
}
// 只要在函數(shù)的返回值前面加上static就可以讓函數(shù)變?yōu)閮?nèi)部函數(shù),其他文件就不能訪問了
// 如果static寫在函數(shù)的實(shí)現(xiàn)中卵史,代表定義一個(gè)內(nèi)部函數(shù)
// 如果static寫在函數(shù)的聲明中战转,代表聲明一個(gè)內(nèi)部函數(shù)
static void sum()
{
printf("123\n");
}
// 只要在函數(shù)的返回值前面加上extern就可以讓函數(shù)變?yōu)橥獠亢瘮?shù),因?yàn)槟J(rèn)就是外部函數(shù)以躯,所以開發(fā)中extern不用寫
// 如果extern寫在函數(shù)的實(shí)現(xiàn)中槐秧,代表定義一個(gè)外部函數(shù)
// 如果extern寫在函數(shù)的聲明中,代表聲明一個(gè)外部函數(shù)
extern void sum()
{
printf("123\n");
}