C語言學(xué)習(xí)第八章(中文版)_第1頁
C語言學(xué)習(xí)第八章(中文版)_第2頁
C語言學(xué)習(xí)第八章(中文版)_第3頁
C語言學(xué)習(xí)第八章(中文版)_第4頁
C語言學(xué)習(xí)第八章(中文版)_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

變量的作用域

與變量的存儲(chǔ)類別

8.8局部變量和全局變量--8.8.1局部變量?jī)?nèi)部變量:在一個(gè)函數(shù)內(nèi)部定義的變量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)有效,即:只有在本函數(shù)內(nèi)才能使用這些變量,故稱為“局部變量”。floatf1(inta)/*函數(shù)f1*/{

int

b,c;…/*a、b、c有效*/}charf2(intx,inty)/*函數(shù)f2*/{int

i,j;/*x、y、i、j有效*/}voidmain()/*主函數(shù)*/{int

m,n;…/*m、n有效*/}8.8局部變量和全局變量--8.8.1局部變量?jī)?nèi)部變量:⑴主函數(shù)中定義的變量只在主函數(shù)中有效,而不因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。⑵不同函數(shù)中可以使用相同名字的變量,它們代表不同的對(duì)象,互不干擾。⑶形式參數(shù)也是局部變量。⑷在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也稱為“分程序”或“程序塊”。8.8局部變量和全局變量--8.8.1局部變量?jī)?nèi)部變量:voidmain(){int

a,b;……{intc;c=a+b;c在此范圍內(nèi)有效a,b在此范圍內(nèi)也有效

……

}…}復(fù)合語句也稱為“分程序”或“程序塊”。8.8局部變量和全局變量--8.8.2全局變量外部變量:函數(shù)之外定義的變量稱為外部變量。外部變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。所以也稱全程變量。

8.8局部變量和全局變量--8.8.2全局變量外部變量:intp=1,q=5;/*外部變量*/floatf1(inta)/*定義函數(shù)f1*/{int

b,c;…}charc1,c2;/*外部變量*/charf2(intx,inty)/*定義函數(shù)f2*/{int

i,j;全局變量p,q的作用范圍

…全局變量c1,c2的作用范圍}voidmain()/*主函數(shù)*/{int

m,n;…}

8.8局部變量和全局變量--8.8.2全局變量例8.15有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生成績(jī),寫一個(gè)函數(shù),求出平均分、最高分和最低分。#include<stdio.h>floatMax=0,Min=0;

/*全局變量*/voidmain()

{floataverage(floatarray[],intn);floatave,score[10];

inti;

for(i=0;i<10;i++)

scanf(“%f”,&score[i]);

ave=average(score,10);

printf(“max=%6.2f\nmin=%6.2f\naverage=%6.2f\n“,Max,Min,ave);

}8.8局部變量和全局變量--8.8.2全局變量floataverage(floatarray[],intn)/*定義函數(shù),形參為數(shù)組*/

{inti;

floataver,sum=array[0];

Max=Min=array[0];

for(i=1;i<n;i++)

{if(array[i]>Max)Max=array[i];

elseif(array[i]<Min)Min=array[i];

sum=sum+array[i];

}

aver=sum/n;

return(aver);

}8.8局部變量和全局變量--8.8.2全局變量8.8局部變量和全局變量--8.8.2全局變量建議:一般不使用全局變量,因?yàn)椋?/p>

全局變量在程序的全部執(zhí)行過程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元。⑵

使用全局變量過多,會(huì)降低程序的清晰性。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量的值,程序容易出錯(cuò)。因此,要限制使用全局變量。⑶降低函數(shù)的通用性。因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。如果將一個(gè)函數(shù)移到另一個(gè)文件中,還要將有關(guān)的外部變量及其值一起移過去。但若該外部變量與其他文件的變量同名時(shí),就會(huì)出現(xiàn)問題,降低了程序的可靠性和通用性。一般要求把C程序中的函數(shù)做成一個(gè)封閉體,除了可以通過“實(shí)參——形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。8.8局部變量和全局變量--8.8.2全局變量例8.16外部變量與局部變量同名。

#include<stdio.h>inta=3,b=5;/*a,b為外部變量*/a,b作用范圍voidmain(){inta=8;/*a為局部變量*/局部變量a作用范圍

printf(“%d”,max(a,b));全局變量b的作用范圍}max(inta,intb)/*a,b為局部變量*/{intc;c=a>b?a∶b;形參a、b作用范圍

return(c);}8.9變量的存儲(chǔ)類別--8.9.1動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式從變量的作用域(即從空間)角度來分,可分為:全局變量局部變量從變量值存在的時(shí)間角度來分,可分為:靜態(tài)存儲(chǔ)方式:指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)方式:則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。該存儲(chǔ)空間可分為:⑴

程序區(qū)⑵靜態(tài)存儲(chǔ)區(qū)⑶

動(dòng)態(tài)存儲(chǔ)區(qū)8.9變量的存儲(chǔ)類別--8.9.1動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型數(shù)據(jù)的存儲(chǔ)類別:數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式。存儲(chǔ)方式分為兩大類:靜態(tài)存儲(chǔ)類動(dòng)態(tài)存儲(chǔ)類⑴

自動(dòng)的(auto)⑵靜態(tài)的(static)⑶寄存器的(register)⑷外部的(extern)根據(jù)變量的存儲(chǔ)類別,可以知道變量的作用域和生存期。8.9變量的存儲(chǔ)類別--8.9.2auto變量自動(dòng)變量auto:專門聲明為static存儲(chǔ)類別的局部變量都是動(dòng)態(tài)分配存儲(chǔ)空間,在調(diào)用該函數(shù)時(shí)系統(tǒng)會(huì)給它們分配存儲(chǔ)空間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)釋放這些存儲(chǔ)空間。因此這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字auto作存儲(chǔ)類別的聲明。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量),都屬此類。例如:int

f(inta)/*定義f函數(shù),a為形參*/{autoint

b,c=3;/*定義b、c為自動(dòng)變量*/

…}8.9變量的存儲(chǔ)類別--8.9.3用static聲明局部變量靜態(tài)變量static:當(dāng)函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值時(shí),該變量稱為靜態(tài)局部變量。用關(guān)鍵字static進(jìn)行聲明。8.9變量的存儲(chǔ)類別--8.9.3用static聲明局部變量例8.17考察靜態(tài)局部變量的值。#include<stdio.h>voidmain(){int

f(int);

inta=2,i;

for(i=0;i<3;i++)

printf(“%d”,f(a);

}

int

f(inta)

{autointb=0;

staticc=3;

b=b+1;

c=c+1;

return(a+b+c);

}8.9變量的存儲(chǔ)類別--8.9.3用static聲明局部變量對(duì)靜態(tài)局部變量的說明:⑴靜態(tài)局部變量屬靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)區(qū)空間而不占靜態(tài)存儲(chǔ)區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。⑵對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。⑶如在定義局部變量時(shí)不賦初值的話,則對(duì)靜態(tài)局部變量來說,編譯時(shí)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來說,如果不賦初值則它的值是一個(gè)不確定的值。⑷雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)不能引用它。8.9變量的存儲(chǔ)類別--8.9.3用static聲明局部變量例8.18輸出1到5的階乘值。#include<stdio.h>voidmain(){int

fac(intn);

inti;

for(i=1;i<=5;i++)

printf(“%d!=%d\n”,i,fac(i));

}

int

fac(intn){staticintf=1;

f=f*n;

return(f);

}8.9變量的存儲(chǔ)類別--8.9.4register變量

寄存器變量register:變量的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個(gè)變量的值時(shí),由控制器發(fā)出指令將內(nèi)存中該變量的值送到運(yùn)算器中。經(jīng)過運(yùn)算器進(jìn)行運(yùn)算,如果需要存數(shù),再從運(yùn)算器將數(shù)據(jù)送到內(nèi)存存放。8.9變量的存儲(chǔ)類別--8.9.4register變量

寄存器變量register的使用:如果有一些變量使用頻繁,則為存取變量的值要花費(fèi)不少時(shí)間。為提高執(zhí)行效率,C語言允許將局部變量的值放在CPU中的寄存器中,需要用時(shí)直接從寄存器取出參加運(yùn)算,不必再到內(nèi)存中去存取。由于對(duì)寄存器的存取速度遠(yuǎn)高于對(duì)內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。8.9變量的存儲(chǔ)類別--8.9.5用extern聲明外部變量外部變量:外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲(chǔ)區(qū)。用extern來聲明外部變量,以擴(kuò)展外部變量的作用城。用extern聲明外部變量:在一個(gè)文件內(nèi)聲明外部變量在多文件的程序中聲明外部變量8.9變量的存儲(chǔ)類別--8.9.5用extern聲明外部變量例8.20用extern聲明外部變量,擴(kuò)展它在程序文件中的作用域。#include<stdio.h>

voidmain(){int

max(int,int);/*外部變量聲明*/

externA,B;

printf("%d\n",max(A,B));}

intA=13,B=-8;/*定義外部變量*/

int

max(int

x,inty)/*定義max函數(shù)*/{intz;z=x>y?x:y;

return(z);}8.9變量的存儲(chǔ)類別--8.9.5用extern聲明外部變量例8.21用extern將外部變量的作用域擴(kuò)展到其他文件。本程序的作用是給定b的值,輸入a和m,求a×b和am的值。文件file1.c中的內(nèi)容為:#include<stdio.h>

intA;/*定義外部變量*/voidmain(){int

power(int);

/*函數(shù)聲明*/

intb=3,c,d,m;

printf(“enterthenumberaanditspowerm:\n”);

scanf(“%d,%d”,&A,&m);

c=A*b;

printf(“%d*%d\n”,A,b,c);

d=power(m);

printf(“%d**%d=%d\n”,A,m,d);

}8.9變量的存儲(chǔ)類別--8.9.5用extern聲明外部變量例8.21用extern將外部變量的作用域擴(kuò)展到其他文件。本程序的作用是給定b的值,輸入a和m,求a×b和am的值。文件file1.c中的內(nèi)容為:

#include<stdio.h>

intA;/*定義外部變量*/

voidmain()

{int

power(int);

/*函數(shù)聲明*/

intb=3,c,d,m;

printf(“enterthenumberaanditspowerm:\n”);

scanf(“%d,%d”,&A,&m);

c=A*b;

printf(“%d*%d\n”,A,b,c);

d=power(m);

printf(“%d**%d=%d\n”,A,m,d);

}

文件file2.c中的內(nèi)容為:

externA;/*聲明A為一個(gè)已定義的外部變量*/

int

powre(intn)

{int

i,y=1;

for(i=1;i<=n;i++)

y=y*A;

return(y);

}8.9變量的存儲(chǔ)類別--8.9.6用static聲明外部變量用static聲明外部變量:在程序設(shè)計(jì)中,某些外部變量只限于被本文件引用,而不能被其他文件引用。這時(shí)可以在定義外部變量時(shí)加一個(gè)staitic聲明。例如:file1.cfile2.c

staticintA;externintA;

voidmain()voidfun(intn){{……A=A*n;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論