新聞中心
C語言中,局部變量和全局變量的問題
解答問題前,先說明一下,當(dāng)全局變量和局部變量同名時,要看當(dāng)前代碼所處的作用域,默認(rèn)使用當(dāng)前作用域內(nèi)的同名局部變量。
公司主營業(yè)務(wù):網(wǎng)站設(shè)計制作、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出棗莊免費(fèi)做網(wǎng)站回饋大家。
分析你所提供的代碼:
#include
int a = 4;
//全局變量
int f(int n)
{
int t = 0;
static int a = 5;
//局部靜態(tài)變量
if( n%2 )
{
int a = 6;
// if作用域內(nèi)局部變量
t += a++;
// 此處的a是指if作用域內(nèi)的局部變量,該變量在作用
// 域結(jié)束后,生存周期結(jié)束。
}
else
{
int a = 7; // else作用域內(nèi)局部變量
t += a++;
// 此處的a是指else作用域內(nèi)的局部變量
// 作用域結(jié)束后,生存周期結(jié)束
}
return t+a++;
// 此外的a是指f函數(shù)作用域內(nèi)的靜態(tài)局部變量,
// 每次f函數(shù)調(diào)用return后,此靜態(tài)局部變量a自增1
}
int main ( void )
{
int s=a, i=0;
// 根據(jù)作用域,此處的a是指全局變量,所以s初始值為4
for(;i2;i++) s+=f(i);
printf("%d\n",s);
return 0;
}根據(jù)以上,分析運(yùn)行流程:
由上可知,s初始值為4;
當(dāng)i=0時,第一次循環(huán),調(diào)用f()函數(shù),由于0%2為0,會進(jìn)入else后代碼,此時t=0+7=7,調(diào)用f()函數(shù)的return時,會返回7+5=12,同時f()函數(shù)的靜態(tài)局部變量a由5變?yōu)?(下次調(diào)用生效),s=4+12=16。
當(dāng)i=1時,第二次循環(huán),調(diào)用f()函數(shù),由于1%2為1,會進(jìn)入if后代碼,此時t=0+6=6,調(diào)用f()函數(shù)的return時,會返回6+6=12,同時f()函數(shù)的靜態(tài)局部變量a由6變?yōu)?(下次調(diào)用生效),s=16+12=28。
當(dāng)i=2時,循環(huán)終止,打印s值為28。
關(guān)于最后的問題,是因為f()函數(shù)中if后面的變量a作用域只限制在if后的花括號內(nèi),代碼退出該作用域后,該變量生存周期結(jié)束而被釋放,return中使用的a是f()函數(shù)中定義的靜態(tài)局部變量a,所以,不管前者如何賦值,對return中的a沒有影響。
c語言定義全局變量的方法
眾所周知,全局變量在被定義后,系統(tǒng)會為全局變量分配內(nèi)存并且它還可以被其他模塊通過C語言中extern關(guān)鍵字調(diào)用。這樣就必須在 xx.C 和xx.H 文件中定義。這種重復(fù)的定義很容易導(dǎo)致錯誤。 下面是只需用在頭文件中定義一次就可以在別的模塊使用的定義方法。
格式: 定義全局宏。
#ifdef xxx_GLOBALS
#define xxx_EXT#else#define xxx_EXT extern
#endif 上面位于.H 文件中,每個全局變量都加上了xxx_EXT的前綴,xxx代表模塊的名字。該模塊的.C文件中有以下定義:#define xxx_GLOBALS
當(dāng)編譯器處理.C文件時,它強(qiáng)制xxx_EXT(在相應(yīng).H文件中可以找到)為空,(因為xxx_GLOBALS已經(jīng)定義)。所以編譯器給每個全局變量分配內(nèi)存空間,而當(dāng)編譯器處理其他.C文件時,xxx_GLOBAL沒有定義,xxx_EXT被定義為extern,這樣用戶就可以調(diào)用外部全局變量。進(jìn)階:在abc.H:#ifdef abc_GLOBALS
#define abc_EXT#else
#define abc_EXT extern#endif
abc_EXT unsigned int Ctr;
同時,abc.H有中以下定義:#define abc_GLOBALS
當(dāng)編譯器處理abc.C時,它使得頭文件變成如下所示,因為abc_EXT被設(shè)置為空。unsigned int Ctr;
這樣編譯器就會將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C文件時,頭文件變成了如下的樣子,因為abc_GLOBAL沒有定義,所以abc_EXT被定義為extern。extern unsigned int Ctr;
在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。
C語言中,我想在一個函數(shù)里用另一個函數(shù)的變量怎么辦??
已經(jīng)有人給你那么多方法了。。。我還是建議不要用extern去使全局變量,也不要把變量定義在頭文件,然后用include把變量包含進(jìn)其它源文件使用,不要這樣做!這是菜鳥的做法!
正確的做法是這樣的,你把變量定義在相應(yīng)的源文件中,定義成全局的,然后寫一個接口去讀取,充分利用封裝的思想!我舉個例子哈:
加入你的變量名是
A,定義在abc.c中。。。
這時候你的正確做法是
在abc.c中寫一個函數(shù),命名為
int
GetAValue(void)
{
return
A;
}
這才是大神的做法!這樣的話如果是在同一個源文件中,可以直接訪問全局變量達(dá)到目的。如果是在不同的源文件的其它函數(shù),就調(diào)用你寫好的
GetAValue()函數(shù)去讀取!
c語言,如何定義數(shù)組為全局變量?
在C語言中,全局變量和函數(shù)聲明及定義并列,也就是說,聲明在最外層作用域的變量即為全局變
如在如下程序中
int?i;
int?main()
{
int?i_copy?=?i;
i?=?9;
return?0;
}
int i就是一個全局變量,故在main函數(shù)中可以調(diào)用或修改i的值
所以,定義數(shù)組也和普通全局變量的方法相同,如
char?str[10];
int?main()
{
str[0]?=?'a';
str[1]?=?'\0';
return?0;
}
拓展資料
C語言是一門通用計算機(jī)編程語言,應(yīng)用廣泛。C語言的設(shè)計目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平臺的特性,以一個標(biāo)準(zhǔn)規(guī)格寫出的C語言程序可在許多電腦平臺上進(jìn)行編譯,甚至包含一些嵌入式處理器(單片機(jī)或稱MCU)以及超級電腦等作業(yè)平臺。
二十世紀(jì)八十年代,為了避免各開發(fā)廠商用的C語言語法產(chǎn)生差異,由美國國家標(biāo)準(zhǔn)局為C語言制定了一套完整的美國國家標(biāo)準(zhǔn)語法,稱為ANSI C,作為C語言最初的標(biāo)準(zhǔn)。目前2011年12月8日,國際標(biāo)準(zhǔn)化組織(ISO)和國際電工委員會(IEC)發(fā)布的C11標(biāo)準(zhǔn)是C語言的第三個官方標(biāo)準(zhǔn),也是C語言的最新標(biāo)準(zhǔn),該標(biāo)準(zhǔn)更好的支持了漢字函數(shù)名和漢字標(biāo)識符,一定程度上實現(xiàn)了漢字編程。
C語言中,全局變量和外部變量有什么區(qū)別?
全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。 它不屬于哪一個函數(shù),它屬于一個源程序文件。
其作用域是整個源程序。在函數(shù)中使用全局變量,一般應(yīng)作全局變量說明。 只有在函數(shù)內(nèi)經(jīng)過說明的全局變量才能使用。
全局變量的說明符為extern。 但在一個函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用可不再加以說明。外部變量是在函數(shù)外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的結(jié)尾。
在此作用域內(nèi),全局變量可為各個函數(shù)所引用。編譯時將外部變量分配在靜態(tài)存儲區(qū)。 有時需要在其他文件中使用extern來聲明外部變量,以擴(kuò)展外部變量的作用域。
也可用static聲明外部變量,使該變量不能被其他文件引用。有時候他們是一樣的,只有稍微一點的區(qū)別而已,不用太過于區(qū)分的。
c語言定義了一個全局變量,為什么該變量在函數(shù)調(diào)用后,值沒發(fā)生改變???
如果通過函數(shù)傳參方式調(diào)用,并且不是傳的指針,那就不會改變原來的值,如果想改變?nèi)肿兞康闹担梢灾苯釉诤瘮?shù)中使用,不需要傳參。也或者你傳指針進(jìn)去
名稱欄目:c語言函數(shù)內(nèi)使用全局變量 c語言定義全局變量的方法
鏈接分享:http://ef60e0e.cn/article/docspgd.html