C語言全局變量和局部變量
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供凱里網(wǎng)站建設(shè)、凱里做網(wǎng)站、凱里網(wǎng)站設(shè)計(jì)、凱里網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、凱里企業(yè)網(wǎng)站模板建站服務(wù),十余年凱里做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
引子---
? ?? ???變量可以在程序中三個(gè)地方說明: 函數(shù)內(nèi)部、函數(shù)的參數(shù)定義中或所有的函數(shù)外部。根據(jù)所定義位置的不同, 變量可分為局部變量、形式參數(shù)和全程變量。從空間角度來看,變量可以分為全局變量和局部變量,而從時(shí)間角度來分的 可以有靜態(tài)存儲(chǔ)變量和動(dòng)態(tài)存儲(chǔ)變量之分。
一。全局變量和局部變量
1。局部變量
他是 指在函數(shù)內(nèi)部定義的變量 作用域?yàn)槎x局部變量的函數(shù) 也就是說他只能在定義他的函數(shù)中使用
最值得注意的是 只有在程序執(zhí)行到定義他的模塊時(shí)才能生成,一旦執(zhí)行退出該模塊則起變量消失
eg.
func ()
{
? ?int x;? ?局部變量x的作用域 很明確
? ?......
}
2。全局變量
在程序執(zhí)行的過程中一直有效
eg.
int x=1;
func ()
{
? ?x=x+1;
}
func1 ()
{
??x=x-1;
}
main ()
{
}
由此不難看出整型x的作用范圍
對于全局變量 如果在定義的時(shí)候不做初始化 則系統(tǒng)將自動(dòng)為起賦值 數(shù)值型為0
字符型為空'\0'
全局變量的弊端 增加內(nèi)存開銷 降低函數(shù)的通用性
定義全局變量時(shí) 理想的位置是在文件的開頭 當(dāng)這些函數(shù)以及同一個(gè)程序中的其他源程序文件中的某些函數(shù)需要使用該全局變量時(shí) 在函數(shù)內(nèi)部對該變量使用extern 加以說明 說明他是外部的
(這里還要做詳細(xì)的講解)
eg.
main ()
{
extern int a,b;
printf ("mIn is %d\n",min(a,b));
}
int a=1,b=2;
int min (x,y)
int x,y;
{
int z;
z=xy?x:y;
return(z);
}
我還要說明的是 對外部變量的說明和對全局變量的定義不是一回事
對外部變量的說明 只是聲明該變量是在外部定義過的一個(gè)全局變量 在這里引用 而對全局變量的定義則是要對起分配存儲(chǔ)單元的
一個(gè)全局變量只能定義一次 可是卻可以多次引用
*** 在同一源文件中,全局變量和局部變量同名時(shí),在局部變量的作用域內(nèi),全局變量不起作用的。
二。靜態(tài)存儲(chǔ)變量和動(dòng)態(tài)存儲(chǔ)變量
對于程序運(yùn)行期間根據(jù)需要進(jìn)行臨時(shí)動(dòng)態(tài)分配存儲(chǔ)空間的變量 為動(dòng)態(tài)存儲(chǔ)變量
對于那些程序運(yùn)行期間永久占用固定內(nèi)存的變量 稱為靜態(tài)存儲(chǔ)變量
還要說明的是 程序的指令代碼是存放在程序代碼區(qū)的 靜態(tài)存儲(chǔ)變量是存放在靜態(tài)數(shù)據(jù)區(qū)的 包括全局變量等 而程序中的動(dòng)態(tài)存儲(chǔ)變量存放在動(dòng)態(tài)數(shù)據(jù)區(qū) 如函數(shù)的形參以及函數(shù)調(diào)用時(shí)的返回地址等
三。C語言中的變量存儲(chǔ)分類指定
? ?
? ? auto
? ? auto稱為自動(dòng)變量 如果函數(shù)不做其他說明的話 均為自動(dòng)變量
? ? static
? ? static稱為靜態(tài)變量。根據(jù)變量的類型可以分為靜態(tài)局部變量和靜態(tài)全程變量。
? ? 1. 靜態(tài)局部變量
? ?
? ???它與局部變量的區(qū)別在于: 在函數(shù)退出時(shí), 這個(gè)變量始終存在, 但不能被其它函數(shù)使用, 當(dāng)再次進(jìn)入該函數(shù)時(shí), 將保存上次的結(jié)果。其它與局部變量一樣。
? ?
? ? 2. 靜態(tài)全程變量
? ?
? ???Turbo C2.0允許將大型程序分成若干獨(dú)立模塊文件分別編譯, 然后將所有模塊的目標(biāo)文件連接在一起, 從而提高編譯速度, 同時(shí)也便于軟件的管理和維護(hù)。靜態(tài)全程變量就是指只在定義它的源文件中可見而在其它源文件中不可見的變量。它與全程變量的區(qū)別是: 全程變量可以再說明為外部變量(extern), 被其它源文件使用, 而靜態(tài)全程變量卻不能再被說明為外部的, 即只能被所在的源文件使用。
? ?
? ?
? ? extern
? ? extern稱為外部變量。為了使變量除了在定義它的源文件中可以使用外, 還要被其它文件使用。因此,? ?必須將全程變量通知每一個(gè)程序模塊文件,? ?此時(shí)可用extern來說明。
eg.
? ?? ???文件1為file1.c? ?? ?? ?? ?? ?? ?文件2為file2.c
? ? int i, j;/*定義全程變量*/? ?? ???extern int i, j;/*說明將i, j從
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???文件1中復(fù)制過來*/
? ? char c;? ?? ?? ?? ?? ?? ?? ?? ???extern char c; /*將c復(fù)制過來*/
? ? void func1(int k);? ?? ?? ?? ?? ?func2()? ?? ???/*用戶定義函數(shù)*/
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? {
? ? main()? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?static float k;/*定義靜態(tài)變量*/
? ? {? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???i=j*5/100;
? ?? ?? ? func1(20);/*調(diào)用函數(shù)*/? ?? ???k=i/1.5;
? ?? ?? ? func2();? ?? ?? ?? ?? ?? ?? ?? ?? ?.
? ?? ?? ? .? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? .
? ?? ?? ? .? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? .
? ?? ?? ? .? ?? ?? ?? ?? ?? ?? ?? ?? ? }
? ???}
? ???func1(int k) /*用戶定義函數(shù)*/
? ???{
? ?? ?? ? j=k*100;
? ???}
? ? 對于以上兩個(gè)文件file1.c和file2.c, 用Turbo C2.0的集成開發(fā)環(huán)境進(jìn)行編譯
連接時(shí), 首先應(yīng)建立一個(gè).prj的文件。例如file.prj, 該文件內(nèi)容如下:
? ???file1.c
? ???file2.c
? ? 然后將file.prj的文件名寫入主菜單Project中的Project Name項(xiàng)中。 再用F9
編譯連接, 就可產(chǎn)生一個(gè)文件名為fioe.exe的可執(zhí)行文件。
? ???
??
? ? register
? ? register稱為寄存器變量。它只能用于整型和字符型變量。定義符register說明的變量被Turbo C2.0存儲(chǔ)在CPU的寄存器中,??而不是象普通的變量那樣存儲(chǔ)在內(nèi)存中, 這樣可以提高運(yùn)算速度。但是Turbo C2.0只允許同時(shí)定義兩個(gè)寄存器變量,一旦超過兩個(gè), 編譯程序會(huì)自動(dòng)地將超過限制數(shù)目的寄存器變量當(dāng)作非寄存器變量來處理。因此, 寄存器變量常用在同一變量名頻繁出現(xiàn)的地方。
? ? 另外, 寄存器變量只適用于局部變量和函數(shù)的形式參數(shù), 它屬于auto型變量,
因此, 不能用作全程變量。定義一個(gè)整型寄存器變量可寫成:
? ?? ?register int a;
? ? 對于以上所介紹的變量類型和變量存儲(chǔ)類型將會(huì)在以后的學(xué)習(xí)中, 通過例行程序中的定義、使用來逐漸加深理解。
局部變量只能定義在函數(shù)體內(nèi),只能用于定義它的函數(shù)和調(diào)用這個(gè)函數(shù)的方法,在其他情況下一般不起作用。
局部變量是在某一函數(shù)內(nèi)定義的變量,有效區(qū)域在本函數(shù)里。
全局變量定義在函數(shù)外,全局起作用。