??通過學(xué)習(xí),我對全局變量以及靜態(tài)本地變量有個簡單基礎(chǔ)的認(rèn)識。以下是我的學(xué)習(xí)筆記,與大家分享,如果有不妥的地方,歡迎大家在評論區(qū)指出來,一起學(xué)習(xí)進步?。?!
創(chuàng)新互聯(lián)建站專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、安丘網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、購物商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為安丘等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。文章目錄??定義在函數(shù)外面的變量。
1.2生存期與作用域??具有全局(任何函數(shù)內(nèi)部)的生存期和作用域。
??代碼測試
#include#include//定義一個全局變量
int gAll=12;
void f(void);
int main()
{printf("in %s gAll=%d\n", __func__,gAll);
f();
f();
printf("agn in %s gAll=%d\n", __func__,gAll);
return 0;
}
void f(void)
{printf("in %s gAll=%d\n", __func__,gAll);
gAll+=2;
printf("agn in %s gAll=%d\n", __func__,gAll);
}
??輸出結(jié)果
in main gAll=12
in f gAll=12
agn in f gAll=14
in f gAll=14
agn in f gAll=16
agn in main gAll=16
??注意
??輸出所在函數(shù)的函數(shù)名用 func ,
??前后是 2個英文半角狀態(tài)的“_”。
??自動:沒有初始化的會自動初始化為0,指針初始化為NULL;
??人為:用編譯時刻已知的值對全局變量初始化,在main函數(shù)之前初始化。
??如果函數(shù)內(nèi)部有與全局變量同名的變量,則全局被隱藏。
??小范圍與大范圍定義了一樣的變量名,大范圍變量被隱藏,執(zhí)行小范圍的變量。
??代碼測試
#include#includeint gAll=12; //定義全局變量,大范圍
void f(void);
int main()
{printf("in %s gAll=%d\n", __func__,gAll);
f();
printf("agn in %s gAll=%d\n", __func__,gAll);
return 0;
}
void f(void)
{int gAll=1; //函數(shù)內(nèi)部定義同名的本地變量,小范圍
printf("in %s gAll=%d\n", __func__,gAll);
gAll+=2;
printf("agn in %s gAll=%d\n", __func__,gAll);
}
??輸出結(jié)果
1.5局部變量in main gAll=12 ?? ? //全局變量
in f gAll=1 ?? ? ?? //函數(shù)內(nèi)部的本地變量
agn in f gAll=3 ? ? ?? //函數(shù)內(nèi)部的本地變量
agn in main gAll=12 ?? //重新返回main,全局變量取消隱藏
(1)局部變量只能在定義的區(qū)域以及他的子區(qū)域中使用;
(2)包括:一個函數(shù)內(nèi)部定義的函數(shù)、函數(shù)形參、復(fù)合語句即{ }大括號中的變量;
(3)同一個區(qū)域不能定義相同的名字;
(4)不同區(qū)域定義相同的名字變量,在本質(zhì)沒有任何關(guān)系。
在本地變量定義時前面加上static修飾符就變成了靜態(tài)本地變量。
2.2生存期與作用域??生存期:全局,當(dāng)函數(shù)離開時,靜態(tài)本地變量會繼續(xù)保持他最后的值;
?? 作用域:定義函數(shù)內(nèi)部;(static的意思是局部區(qū)域訪問)
?? 初始化:靜態(tài)本地變量的初始化只會在第一次進入這個函數(shù)的時候做,以后進入函數(shù)時,會保持上次離開函數(shù)的值。
??代碼測試
int gAll=12;
void f(void);
int main()
{f();
f();
f();
return 0;
}
void f(void)
{static int all=1;
printf("in %s all=%d\n", __func__,all);
all++;
printf("in %s all=%d\n", __func__,all);
}
??輸出結(jié)果
2.3實際上靜態(tài)本地變量是一種特殊的全局變量in f all=1
in f all=2
in f all=2
in f all=3
in f all=3
in f all=4
??靜態(tài)本地變量和全局變量的地址挨著,即他們兩個在內(nèi)存中放在一起,在內(nèi)存相同的區(qū)域
??代碼測試
#include#includeint gAll=12;
void f(void);
int main()
{f();
return 0;
}
void f(void)
{static int all=1;
int b=2;
printf("in %s &gAll=%p\n", __func__,&gAll);
printf("in %s &all=%p\n", __func__,&all);
printf("in %s &b=%p\n", __func__,&b);
}
??輸出結(jié)果
3.返回指針的函數(shù) 3.1返回本地變量的指針in f &gAll=0000000000403010
in f &all=0000000000403014?//全局變量的地址 挨著 靜態(tài)本地變量的地址
in f &b=000000000062FDEC
?? 這種做法是危險的,因為當(dāng)你離開這個函數(shù),本地變量的空間會被free掉,當(dāng)定義下一個變量的時候,會直接放在這個內(nèi)存空間里面,所以可能還是原來的值,也可能不是原來的值。
??代碼測試
#include#includeint *g(void);
void f(void);
int main()
{int *p=g();
printf("*p=%d\n",*p);
f();
printf("*p=%d\n",*p);
return 0;
}
int *g(void)
{int i=1;
return &i;
}
void f(void)
{int k=12;
printf(" k=%d\n",k);
}
??輸出結(jié)果
3.2返回全局變量和靜態(tài)本地變量的地址是安全的*p=1
k=12
*p=12 原來地址被后來定義的k占用
??他們的指針和函數(shù)沒有關(guān)系
3.3返回malloc的指針??內(nèi)存是安全的,但是容易出現(xiàn)問題
3.4最好的方法是 返回傳入的指針 4.全局變量tips 4.1不要使用全局變量的來傳遞函數(shù)的參數(shù)和結(jié)果 4.2盡量避免使用全局變量?? “豐田汽車的案子”代碼中使用了大量的全局變量,無法維護
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前題目:C語言全局變量基礎(chǔ)學(xué)習(xí)-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://www.rwnh.cn/article38/dososp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站制作、定制網(wǎng)站、自適應(yīng)網(wǎng)站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)