《C語言程序設(shè)計實用教程》課件第5章 函數(shù)_第1頁
《C語言程序設(shè)計實用教程》課件第5章 函數(shù)_第2頁
《C語言程序設(shè)計實用教程》課件第5章 函數(shù)_第3頁
《C語言程序設(shè)計實用教程》課件第5章 函數(shù)_第4頁
《C語言程序設(shè)計實用教程》課件第5章 函數(shù)_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章函數(shù)5.1函數(shù)的定義與調(diào)用★5.2函數(shù)的參數(shù)傳遞★5.3函數(shù)的重載5.4函數(shù)嵌套與遞歸☆5.5返回指針類型的函數(shù)☆5.6指向函數(shù)的指針☆5.7變量的作用域與可見性★5.8變量的存儲類型和生存期5.9C程序的多文件結(jié)構(gòu)5.10編譯預(yù)處理第5章函數(shù)模塊化程序設(shè)計思路:在設(shè)計一個較大的程序時,往往把它分為若干個模塊,每一個模塊用一個函數(shù)(模塊單位)實現(xiàn).一個函數(shù)(過程):完成一個具體的、獨立的功能。函數(shù)是處理問題過程的一種抽象,函數(shù)編寫好后,有利于代碼的重用.第5章函數(shù)C程序結(jié)構(gòu):由一個主函數(shù)和若干個其他函數(shù)構(gòu)成.主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用5.1函數(shù)的定義與調(diào)用5.1.1函數(shù)的定義5.1.2函數(shù)的調(diào)用5.1.1函數(shù)的定義程序中用到的所有函數(shù),一般要“先定義函數(shù),然后調(diào)用”定義函數(shù)時指明:函數(shù)名字、函數(shù)返回值類型、參數(shù)的個數(shù)與類型函數(shù)實現(xiàn)的功能。5.1.1函數(shù)的定義函數(shù)的聲明格式:

返回值類型函數(shù)名([形式參數(shù)表])//函數(shù)頭{

語句序列//函數(shù)體}函數(shù)聲明例子:求階乘n!longFactor(intn){longs=1;for(i=1;i<=n;i++)s=s*i;returns;}函數(shù)的調(diào)用:longk;k=Factor(5);k=Factor(20)+2;5.1.1函數(shù)的定義函數(shù)聲明格式:

返回值類型函數(shù)名([形式參數(shù)表])//函數(shù)頭{

語句序列//函數(shù)體}1.函數(shù)名:任何合法的C標(biāo)識符。2.返回類型:規(guī)定了函數(shù)返回給調(diào)用者的結(jié)果值類型。

2.返回類型(1)如果函數(shù)的返回類型不是void類型,則這個函數(shù)的函數(shù)體中要包含一個return語句,且return之后必須帶返回值。

函數(shù)聲明例子:求兩個數(shù)的較大者。intmax(inta,intb){returna>b?a:b;}函數(shù)的調(diào)用:c=max

(2,3);5.1.1函數(shù)的定義2.返回類型(2)如果返回類型不寫,則默認(rèn)的返回類型為int。

例如:

main(){…return0;}該函數(shù)的返回類型是int。函數(shù)體中應(yīng)有:returnexpression;5.1.1函數(shù)的定義

2.返回類型(3)返回類型為void,表示函數(shù)調(diào)用后無返回值在函數(shù)體中可不寫return語句,函數(shù)調(diào)用執(zhí)行到函數(shù)體的最后一個右括號“}”,將自動返回到調(diào)用者。如果寫return語句,在return之后必須不帶返回值。例如:

5.1.1函數(shù)的定義voidprintHello(){printf(“Hello,everyone!\n”);return;//可缺省}函數(shù)的調(diào)用:printHello();printHello()3.return語句的一般格式:

return[表達式];return語句:使程序流程從函數(shù)調(diào)用中返回,表達式的值就是函數(shù)調(diào)用的返回值。如果函數(shù)沒有返回值(返回類型為void時),則return語句中的表達式省略。5.1.1函數(shù)的定義main(){…Y=f(2);…}intf(intx){…returnx*x;}4.形式參數(shù)表

指明該函數(shù)所需要的若干參數(shù)和這些參數(shù)的類型,各參數(shù)之間用逗號分開。

形式參數(shù)表的格式:

類型1形參1,類型2形參2,,類型n形參n5.1.1函數(shù)的定義intmax(intx1,intx2){...}intmax(intx1,x2){...}error4.形式參數(shù)表函數(shù)無參數(shù)時:形式參數(shù)表為空(void)。例如:

5.1.1函數(shù)的定義

f(){…}

等同于:

f(void){…}5.1.1函數(shù)的定義函數(shù)的聲明格式:

返回值類型函數(shù)名([形式參數(shù)表]){

語句序列}5.函數(shù)頭與函數(shù)體函數(shù)頭:定義了函數(shù)的功能是什么,怎樣調(diào)用它。函數(shù)體:定義功能的具體實現(xiàn)過程代碼。調(diào)用時,只需關(guān)心函數(shù)頭,而無需關(guān)心函數(shù)體。函數(shù)頭函數(shù)體5.1.2函數(shù)的調(diào)用函數(shù)定義好后,就可以被其它函數(shù)調(diào)用被調(diào)用的函數(shù)叫做Called,調(diào)用者叫做Calling。1.函數(shù)調(diào)用的一般格式:

函數(shù)名(實參表)

實參表是用逗號分開的實參。(1)實參表與形參表匹配:實參表與函數(shù)定義中形參表的形參類型和形參個數(shù)要一一匹配。5.1.2函數(shù)的調(diào)用longFactor(intn){….}函數(shù)調(diào)用形式:k=Factor(5);K=Factor(5.0)floatmax(floatx1,floatx2){…}函數(shù)調(diào)用形式:floatx=10.0f;y=89.7f,z=-78.7f;m=max(x,y);m=max(x,y,z);m=max(max(x,y),z);m=max(2,3);m=max(2.0,3);m=max(2.0f,3);例如:2.0類型doublex5.1.2函數(shù)的調(diào)用(1)函數(shù)的調(diào)用無返回值(返回類型void),函數(shù)調(diào)用可作為一條語句單獨出現(xiàn)。

voidprintHello(){…}函數(shù)調(diào)用形式:

printHello();例如:5.1函數(shù)的定義與調(diào)用書寫函數(shù)時注意:(1)程序中如果定義了多個函數(shù),這些函數(shù)定義在書寫上應(yīng)該是并列的關(guān)系,而不是嵌套的關(guān)系。例如,一個源程序有三個函數(shù)組成:voidf1(floatx){…}voidf2(intx){…}intmain(){…}intmain(){

voidf1(floatx){…}}voidf2(intx){…}5.1函數(shù)的定義與調(diào)用書寫函數(shù)注意點:(2)遵循“函數(shù)定義在前、調(diào)用在后”原則。如果“函數(shù)調(diào)用在前、定義在后”,則函數(shù)調(diào)用之前必須書寫函數(shù)原型。函數(shù)原型的格式:

函數(shù)頭;

例如:voidf1(floatx);或voidf1(float);在函數(shù)原型中形式參數(shù)的名字可以不寫。5.1函數(shù)的定義與調(diào)用書寫函數(shù)時要注意點:例如,函數(shù)定義在前,函數(shù)調(diào)用在后的情形:voidf1(floatx){…}voidf2(intx){…}intmain(){floata=3.0;f1(2.0);f2(a);}5.1函數(shù)的定義與調(diào)用書寫函數(shù)時要注意點:例如,函數(shù)定義在后,函數(shù)調(diào)用在前的情形:voidf1(float);//函數(shù)原型,省略了形參名voidf2(intx);//函數(shù)原型intmain(){

f1(2.0f);f2(10);

}voidf1(floatx){…}//函數(shù)定義voidf2(intx){…}//函數(shù)定義函數(shù)定義,函數(shù)原型,函數(shù)調(diào)用有啥區(qū)別?5.1函數(shù)的定義與調(diào)用函數(shù)調(diào)用的執(zhí)行過程:例5-1編寫求xn的函數(shù)。解題思路:求xn的函數(shù)定義為函數(shù):

doublepower(doublex,intn){inti;doublexn=1;for(i=1;i<=n;i++) xn*=x;returnxn;}voidmain(){ intn;doublex;printf("x,n=?");scanf("%lf,%d",&x,&n);printf("%.4f\n",power(x,n));}x,n=?12.5,2156.2500doublepower(doublex,intn){inti;doublexn=1;for(i=1;i<=n;i++) xn*=x;returnxn;}例5-2輸出10000之內(nèi)的所有完全數(shù)。解題思路:完全數(shù)是指等于其所有因子和(包括1但不包括這個數(shù)本身)的數(shù)。例如,6=1×2×3,6=1+2+3,則6是完全數(shù)1.定義兩個函數(shù):intisPerfect(intx),用于判斷x是否完全數(shù);voiddisplayPerfect(intx),用于輸出x的因子之和的式子。2.在main()函數(shù)中使用一個for循環(huán),檢查1到10000之間的所有整數(shù)是否為完全數(shù)。#include<stdio.h>intisPerfect(intx);

//函數(shù)原型,判斷x是否完全數(shù)voiddisplayPerfect(intx);

//函數(shù)原型,輸出x的因子之和的公式voidmain(){intx;for(x=1;x<10000;x++) if(isPerfect(x)) displayPerfect(x);}intisPerfect(intx){ inty=0,i;//y存放因子之和

for(i=1;i<x;i++) if(x%i==0)//i是x的因子時,加到y(tǒng)

y+=i; if(y==x) return1; else return0;}voiddisplayPerfect(intx)//輸出x的因子之和的公式{inti; printf("%d=",x); for(i=1;i<x;i++) if(x%i==0){

if(i!=1)printf("+"); printf("%d",i);

}

printf("\n");}printf(i==1?"%d":"+%d",i);5.2函數(shù)的參數(shù)傳遞函數(shù)的調(diào)用者如何將實際參數(shù)值傳遞給被調(diào)用者?C語言的參數(shù)傳遞方式:按值傳遞按地址傳遞。C++語言增加:按引用傳遞5.2.1按值傳遞按值傳遞:當(dāng)函數(shù)的形參為非指針類型時,則此形參是值參數(shù)。函數(shù)調(diào)用時,將實參的值傳遞給對應(yīng)的形參。單方向傳遞。不會因為被調(diào)用函數(shù)中對形參值的改變而影響實參的值。5.2.1按值傳遞例5-3按值傳遞的例子。voidswap(intx,inty){inthold;hold=x;x=y;y=hold;

printf("x=%d,y=%d\n",x,y);}voidmain(){inta=1,b=2;swap(a,b);

printf("a=%d,b=%d\n",a,b);}x=2,y=1a=1,b=2xab1212y實參形參傳值5.2.2按地址傳遞按地址傳遞:當(dāng)函數(shù)的形參為指針類型時,則形參是地址變量。函數(shù)調(diào)用時,是將實參的地址傳遞給對應(yīng)的形參指針變量。voidswap(int*x,int*y)swap(&a,&b)給形參傳是變量的地址值5.2.2按地址傳遞例5-4利用地址參數(shù)將兩變量的值進行交換。voidswap(int*x,int*y){inthold;hold=*x;*x=*y;*y=hold;printf("x=%d,y=%d\n",*x,*y);}voidmain(){inta=1,b=2;swap(&a,&b);printf("a=%d,b=%d\n",a,b);}x=2,y=1a=2,b=1實參:12a(1000)b(1004)&b形參:&axy*x*y給形參傳的值是變量的地址5.2.2按地址傳遞地址形參對應(yīng)的實際參數(shù)是變量地址。在子函數(shù)的函數(shù)體中,使用指針取內(nèi)容運算。如:*x給形參指向的實參對象賦新值,從而改變實參的值。例5-5定義一函數(shù)求一元二次方程的實根。解題思路:定義求實根的函數(shù):intcomputRoots(doublea,doubleb,doublec,double*x1,double*x2)參數(shù)a,b,c是值參x1,x2是地址參數(shù),用以返回兩實根返回類型int,標(biāo)志一元二次方程是否有實根當(dāng)返回結(jié)果為0時,無實根當(dāng)返回結(jié)果為1時,有相同的兩個實根當(dāng)返回結(jié)果為2時,有不同的兩個實根intcomputRoots(double,double,double,double*,double*);

//函數(shù)原型intmain(){doublea,b,c;doublex1,x2;intflag;printf("Inputa,b,c?");scanf("%lf,%lf,%lf",&a,&b,&c);flag=computRoots(a,b,c,&x1,&x2);if(flag==0)) printf("此方程沒有實根,或此方程不是一元二次方程.\n");elseprintf("此方程實根為:x1=%8.4f,x2=%8.4f\n",x1,x2);}intcomputRoots(doublea,doubleb,doublec,double*x1,double*x2){ intresult; doublet;

if(fabs(a)<1e-6)//判斷a==0, result=0;//方程不是一元二次方程

else{t=b*b-4*a*c; if(fabs(t)<1e-6){//當(dāng)t==0有兩個相等的實根*x1=*x2=-b/(2*a); result=1; } elseif(t>1e-6){//當(dāng)t>0有兩個不同的實根

*x1=(-b+sqrt(t))/(2.0*a);*x2=(-b-sqrt(t))/(2.0*a); result=2; } else//無實根

result=0;} returnresult;}Inputa,b,c?1,-4,3此方程實根為:x1=3.0000,x2=1.000005.2.3按引用傳遞(c++中提供)1.引用型變量的概念引用變量是另一個變量的別名。

聲明語句:類型&變量名

例如:intn;int&m=n當(dāng)聲明一個引用型變量時,需要用一個已存在的變量對它進行初始化。

105.2.3按引用傳遞1.引用型變量的概念例如:intn;int

&m=n;m是變量n的別名對變量m的訪問相當(dāng)于對變量n的訪問給n分配存儲單元,m使用n的存儲單元

m=10;相當(dāng)于:

n=10;mn5.2.3按引用傳遞2.函數(shù)的引用形參當(dāng)函數(shù)的參數(shù)為引用類型時,則對形參的任何訪問等同于對實參的訪問按引用傳遞是C++增加的參數(shù)類型,源文件的后綴名一定要為.cpp,而不能為.c。voidswap(int&x,int&y)例5-6利用引用參數(shù)將兩變量的值進行交換定義一函數(shù)實現(xiàn)兩個變量值的交換,并帶有兩個引用參數(shù)的:voidswap(int&x,int&y)調(diào)用語句swap(a,b);注意:引用形參對應(yīng)的實參,是一般的變量,而不是變量的地址。//ch5_6.cpp#include<stdio.h>voidswap(int&x,int&y){inthold;hold=x;x=y;y=hold;}voidmain(){inta=1,b=2;

printf("a=%d,b=%d\n",a,b);

swap(a,b);printf("a=%d,b=%d\n",a,b);}a=1,b=2;a=2,b=15.3函數(shù)嵌套與遞歸嵌套:在一個函數(shù)定義的函數(shù)體中直接調(diào)用了另外一個函數(shù)。遞歸:在一個函數(shù)定義的函數(shù)體中直接或間接地調(diào)用了自身函數(shù)。5.3函數(shù)嵌套與遞歸5.3函數(shù)嵌套與遞歸5.3函數(shù)嵌套與遞歸遞歸技術(shù)解決問題時采用“依此類推”、“用同樣的步驟重復(fù)”的思想,定義自身中又用到了自身:n!=n*(n-1)!用簡單的程序來解決復(fù)雜計算問題,但是運算量較大。幾個遞歸定義的例子

例5-7用遞歸法求階乘n!。求n!的遞歸函數(shù)定義:longFactorial(intn) {

if(n==1)

return1;

else returnn*Factorial(n-1);}遞歸終結(jié)點遞歸調(diào)用自身調(diào)用語句y=Factorial(5);的執(zhí)行過程(a)遞歸調(diào)用次序(b)遞歸調(diào)用返回值例5-7用遞歸法求組合數(shù)。解題思路:定義求組合數(shù)的函數(shù):

intcomb(intm,intn)

組合函數(shù)的遞歸定義:組合數(shù)的概念從m個不同元素中,任取n(m≤n)個元素并成一組,叫做從m個不同元素中取出n個元素的一個組合;表示為:

Cmn=Pmn/n!=m!/(n!(m-n)!)例5-8用遞歸法求組合數(shù)。voidmain(){intComb(intm,intn);//函數(shù)原型

intm,n; printf("m=");

scanf("%d",&m); printf("n="); scanf("%d",&n);printf("Comb(%d,%d)=%d\n",m,n,

Comb(m,n));}例5-8用遞歸法求組合數(shù)。intComb(intm,intn){ if(n==0||m==n)return1; //結(jié)束遞歸的條件

elseif(n==1)returnm; //結(jié)束遞歸的條件

elseif(n>1)//遞歸調(diào)用Comb函數(shù)自身returnComb(m-1,n-1)+Comb(m-1,n);

else{ printf("n不能為負(fù)\n"); return-1;

}}m=4n=2Comb(4,2)=65.4返回指針類型的函數(shù)函數(shù)的返回值為指針類型從函數(shù)調(diào)用后返回指向數(shù)據(jù)的指針或地址。定義返回指針類型的函數(shù)形式:

類型名*函數(shù)名(參數(shù)表列){…}例5-9返回指針類型的函數(shù)應(yīng)用實例。要求定義一函數(shù):

int*pf(intx,inty,int*z)將x、y相加的結(jié)果的數(shù)據(jù)地址放入z變量中,同時也作為函數(shù)的返回結(jié)果。int*pf(intx,inty,int*z){

int*p;

p=z; *p=x+y;//將x、y相加的結(jié)果的地址放入z指針變量

returnp; //返回相加的結(jié)果地址}voidmain(){ inta=10,b=20,c; int*p; p=pf(a,b,&c);

//p指向變量c

printf(“c=%d,*p=%d\n”,c,*p);//輸出數(shù)據(jù)c與*p相同}c=30,*p=30P是局部變量,為什么可以返回?5.5指向函數(shù)的指針前面我們介紹了指向數(shù)據(jù)的指針例如:int*pi;double*pd;對程序中定義的每一函數(shù)也要分配一段存儲空間,用以存放函數(shù)的代碼。函數(shù)名:代表函數(shù)代碼在內(nèi)存中的起始地址。指向函數(shù)的指針:用來存放函數(shù)代碼首地址的變量。又稱為函數(shù)指針。聲明函數(shù)指針的格式:

返回類型(*函數(shù)指針名)(形參表)5.5指向函數(shù)的指針1.聲明一個函數(shù)指針的語法格式為:

返回類型(*函數(shù)指針名)(形參表)(1)返回類型:說明函數(shù)指針指向的函數(shù)的返回類型是什么?(2)(形參表):說明函數(shù)指針指向的函數(shù)的形參表類型和個數(shù);(3)(*函數(shù)指針名):園括號中表示的函數(shù)指針名

例如:int(*p)(int,int);定義p是指向函數(shù)的指針變量,指向返回類型為int、有兩個int參數(shù)的函數(shù)。p的類型用int(*)(int,int)

表示。5.5指向函數(shù)的指針2.聲明了函數(shù)指針之后,要對函數(shù)指針賦值,語法格式:函數(shù)指針名=函數(shù)名;賦值號右邊的函數(shù)名,要與函數(shù)指針的類型相同(即具有相同的返回類型和形參表)例如:intadd(intx,inty){returnx+y;}int(*p)(int,int);p=add;5.5指向函數(shù)的指針

3.通過函數(shù)指針名調(diào)用指向的函數(shù)。調(diào)用語法格式:

函數(shù)指針名(實參表)或(*函數(shù)指針名)(實參表)例如:調(diào)用函數(shù)add的形式:

p(2,3)

(*p)(2,3)等同于add(2,3)例5-10通過函數(shù)指針實現(xiàn)加減計算器。intsub(intx,inty);//函數(shù)原型intadd(intx,inty);voidmain(){ inta=10,b=20,c; intmenu;

int(*p)(int,int); printf("1--add\n2---sub\nYourselection:"); scanf("%d",&menu); if(menu==1)p=add; elsep=sub; c=p(a,b);//或者c=(*p)(a,b)

printf("c=%d,(*p)(a,b)=%d\n",c,(*p)(a,b));}intsub(intx,inty){ returnx-y; }intadd(intx,inty){returnx+y;}5.6變量的作用域與可見性變量的作用域:變量的有效訪問范圍變量的可見性:變量是否能被訪問。變量只有在其作用域內(nèi)才能可見。例如,我們在某個函數(shù)中聲明的變量就只能在這個函數(shù)中使用,這就是受變量的作用域與可見性的限制。5.6.1變量的作用域變量作用域的基本規(guī)則:(1)塊作用域或函數(shù)作用域在函數(shù)體內(nèi)或函數(shù)中的某代碼塊內(nèi)聲明的變量,被稱為局部變量(Localvariable)。

局部變量的作用域:它所在的代碼塊(整個函數(shù)或函數(shù)中的某代碼塊)。5.6.1變量的作用域變量作用域的基本規(guī)則:(2)文件作用域在函數(shù)的外面聲明的變量被稱為全局變量(Globalvariable)。全局變量的作用域是整個文件。當(dāng)前文件下的所有函數(shù)都能訪問全局變量。intsum=0;//聲明全局變量sum

voidf1(intx,inty){//聲明參數(shù)x,yinti=1;//聲明局部變量i

sum+=x+y+i;//將結(jié)果值賦給全局變量sum}voidf2(intx){

sum+=x;//將x加到全局變量sum

i=10;//錯誤!i變量未聲明}voidmain(){f1(1,2);f2(3);printf(“%d”,sum);}sum的作用域5.6.1變量的作用域變量的作用域的基本規(guī)則:(3)函數(shù)原型作用域是c語言最小的作用域。函數(shù)原型中聲明的形式參數(shù)的作用域就是函數(shù)原型。即函數(shù)形參表的左、右園括號之間。書寫函數(shù)原型時通常可以只聲明形參的類型,形參的名字可任意命名或不寫。例如:floatmax(floatx,floaty);或者

floatmax(float,float);5.6.2變量的可見性變量的可見性:是指程序運行到某一處,能夠訪問該變量,就說在該處是變量可見的。作用域與可見性的一般規(guī)則:(1)變量必先聲明,然后才能使用(2)在同一作用域下,不能聲明兩個同名的變量;(3)在沒有相互包含關(guān)系的不同作用域中定義的同名變量,互不影響;(4)如果函數(shù)中的局部變量或參數(shù)與全局變量同名,則全局變量將被“屏蔽”(暫不可見),直到塊結(jié)束。例5-11同名變量可見性應(yīng)用例子。#include<stdio.h>intsum=0;voidmain(){charb='A';

{

intsum=2;

{

intb=3;

printf("b=%d,usedthevariblebofinnerblock.\n",b);

} printf("b=%c,usedthevariblebofmain.\n",b); printf("sum=%d,usedthevariblesumofmain.\n",sum);

}

printf("sum=%d,usedsumofglobalvariable.\n",sum);}內(nèi)塊外塊文件域5.7變量的存儲類型和生存期5.7.1變量的生存期變量的生存期:一個變量從被聲明且分配存儲空間開始,一直到被釋放空間為止的時間。全局變量的生存期:程序的整個運行過程。函數(shù)中的局部變量:在調(diào)用該函數(shù)時臨時分配空間,在該函數(shù)調(diào)用結(jié)束后局部變量的空間也就釋放了,即局部變量不存在了。5.7.2變量的存儲類型變量的存儲類型auto自動類型(缺?。﹔egister寄存器類型static靜態(tài)類型Extern外部類型。5.7.2變量的存儲類型變量的存儲類型

(1)auto自動類型(缺?。゛uto是變量的默認(rèn)存儲類型。自動類型變量定義在塊內(nèi)。自動變量的生存期和作用域是一致的。例如:intfun(intx){

autointa,b=10;….}a和b是自動變量。執(zhí)行函數(shù)fun時自動分配a和b的存儲空間,執(zhí)行完fun后,自動釋放a和b的存儲空間。5.7.2變量的存儲類型變量的存儲類型(2)寄存器類型(register)變量用register修飾的變量。例如:registerintr;寄存器類型的變量是局部變量。系統(tǒng)盡可能將此類型的變量值保放在CPU的寄存器中,以提高程序的運行速度.5.7.2變量的存儲類型變量的存儲類型(3)靜態(tài)類型(static)變量用static修飾的變量。例如:staticints;靜態(tài)變量的生存期:是整個程序的執(zhí)行過程。靜態(tài)變量占用的空間要到程序運行結(jié)束時才被釋放。如果程序未初始化靜態(tài)變量,那么系統(tǒng)將其初始化為0,且初始化值只進行一次。5.7.2變量的存儲類型靜態(tài)類型(static)變量根據(jù)靜態(tài)變量定義的位置不同,分為靜態(tài)局部變量和靜態(tài)全局變量靜態(tài)局部變量:在函數(shù)體內(nèi)或塊內(nèi)用static修飾的局部變量。靜態(tài)局部變量的值,在函數(shù)調(diào)用結(jié)束后一直保留,即存放其值空間在函數(shù)調(diào)用結(jié)束后不會被釋放,在下次調(diào)用此函數(shù)時靜態(tài)局部變量是上一次函數(shù)調(diào)用結(jié)束時的值。靜態(tài)全局變量:用static修飾的全局變量。全局靜態(tài)變量的作用域只限于本文件模塊(即被聲明的文件中)。例5-12靜態(tài)變量的應(yīng)用例子。staticcharx;//聲明靜態(tài)全部變量xvoidfun(){

staticinta=2;//聲明靜態(tài)局部變量a intb=2;//聲明局部變量b

a++; b++; printf("a=%d,b=%d\n",a,b);}voidmain(){fun();fun();fun();

printf("x=%d\n",x);}a=3,b=3a=4,b=3a=5,b=3x=05.6.2變量的存儲類型(4)外部類型(extern)變量用extern修飾的變量。例如:

externs;

extern一般用來修飾全局變量,用于在相關(guān)的一組源文件中共享一組變量。

5.8C程序的多文件結(jié)構(gòu)一個C程序可

溫馨提示

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

評論

0/150

提交評論