語言課件第七章_第1頁
語言課件第七章_第2頁
語言課件第七章_第3頁
語言課件第七章_第4頁
語言課件第七章_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

67

頁第1

頁第七章大連理工大學(xué)函數(shù)共

67

頁第2

本章要點函數(shù)的定義函數(shù)的調(diào)用函數(shù)間的數(shù)據(jù)傳遞變量的存儲類型變量的作用范圍內(nèi)部函數(shù)和外部函數(shù)共

67

頁第3

頁C程序是函數(shù)的集合體,每個函數(shù)是一個獨立的程序模塊。有一個主函數(shù),若干個子函數(shù),程序總是從主函數(shù)開始執(zhí)行;函數(shù)可集中或分散存放在一個或多個源程序文件中。所有子函數(shù)地位平等,可互相調(diào)用、自我調(diào)用?!ひ牒瘮?shù)的優(yōu)點:減少重復(fù)編寫程序的工作量;使程序便于調(diào)試和閱讀。函數(shù)F1()main()F11()F2()F21()F22()C語言程序的結(jié)構(gòu)7.1函數(shù)的概念和函數(shù)的定義共

67

頁第4

頁數(shù)學(xué)函數(shù)

math.h字符和字符串函數(shù)

ctype.h,string.h輸入/輸出函數(shù)

stdio.h動態(tài)存儲分配函數(shù)

calloc(),malloc()形式無參函數(shù)有參函數(shù)空函數(shù)庫函數(shù)用戶定義函數(shù):C函數(shù)的分類共

67

頁第5

頁[7-1]輸入三個整數(shù),計算它們的和并輸出運算結(jié)果。main(){inta,b,c,sum;scanf("%d,%d,%d",&a,&b,&c);sum=add(a,b,c);printf("sum=%d\n",sum);}intadd(intx,inty,intz){ints;s=x+y+z;returns;}函數(shù)示例定義的求和函數(shù)共

67

頁第6

頁7.1.2函數(shù)的定義定義函數(shù)應(yīng)包括的內(nèi)容:(1)指定函數(shù)的名字,以便以后按名調(diào)用;(2)指定函數(shù)的類型,即函數(shù)值的類型;(3)指定函數(shù)的參數(shù)的名字和類型(有參);(4)指定函數(shù)執(zhí)行的操作,即函數(shù)完成的功能。在程序中用到的所有函數(shù),必須先定義,后使用。共

67

頁第7

頁定義函數(shù)的一般形式類型標(biāo)識符函數(shù)名(形式參數(shù)表){[說明部分]

語句}若無參數(shù),寫void或空。是被初始化的內(nèi)部變量,壽命和可見性僅限于函數(shù)內(nèi)部若不說明類型,一律自動按整型處理函數(shù)體(一段程序,實現(xiàn)函數(shù)的功能)共

67

頁第8

頁1.無參函數(shù)的定義形式

類型標(biāo)識符函數(shù)名()

{

[說明部分]

語句

}[例7-1]print_message(){printf("Howareyou!\n");}共

67

頁第9

頁[例7-2]intmax(intx,inty){intz;z=x>y?x:y;returnz;}類型標(biāo)識符函數(shù)名(形式參數(shù)表列)

{[說明部分]

語句

}

intmax(x,y)

intx,y;

{intz;z=x>y?x:y;returnz;}形參變量的說明(傳統(tǒng)形式)形參變量的說明(現(xiàn)代形式)2.有參函數(shù)的定義形式共

67

頁第10

頁7.1.3函數(shù)的調(diào)用1.函數(shù)調(diào)用的一般形式為:

函數(shù)名(實際參數(shù)列表);或函數(shù)名(實際參數(shù)列表)說明:實參必須有確定的值,可以是常量、變量、表達式及函數(shù)調(diào)用。實參與形參的類型、個數(shù)、順序必須一致。多個實參用逗號分隔。

2.

執(zhí)行過程:計算各個表達式;把得到值賦給對應(yīng)的形參;執(zhí)行函數(shù)體;遇到return語句或執(zhí)行完最后一條語句,返回到函數(shù)調(diào)用處。共

67

頁第11

頁(1)函數(shù)語句:

(把函數(shù)調(diào)用作為一個語句)

一般形式:函數(shù)名(實際參數(shù)表);

使用情況:這種方式常用于調(diào)用一個可以忽略返回值或沒有返回值的函數(shù),只要求函數(shù)完成一定的操作。例如:print_message();3.函數(shù)調(diào)用的具體方式(2)函數(shù)表達式:(函數(shù)調(diào)用出現(xiàn)在一個表達式中)一般形式:變量名=函數(shù)表達式

使用情況:這種表達式稱為函數(shù)表達式。要求函數(shù)帶回一個確定的值參加表達式的運算。例如:c=3+max(a,b);d=pow(c,i);共

67

頁第12

頁7.1.4函數(shù)的返回值2.

函數(shù)的返回值語句一般形式:

return表達式;

或return(表達式);

功能:退出函數(shù),將表達式的值帶回主調(diào)函數(shù),回到程序原來的位置繼續(xù)執(zhí)行。

定義:通過函數(shù)調(diào)用使主調(diào)函數(shù)得到一個確定的值,稱為函數(shù)的返回值。共

67

頁第13

頁說明:return語句只能把一個返回值傳遞給調(diào)用函數(shù)。返回值的類型為定義的函數(shù)類型,若return語句中表達式類型與函數(shù)類型不一致,以函數(shù)類型為準(zhǔn)。返回值可以是有確定值的常量、變量或表達式,也可以是地址。當(dāng)返值是地址時,應(yīng)該用指針接受。無返回值的函數(shù),定義為void類型(無類型函數(shù))。一個函數(shù)中可以有多個返回語句。共

67

頁第14

頁[例7-3]用函數(shù)facto計算m階乘。main(){intm;longmm;longfacto(int);

scanf("%d",&m);mm=facto(m);

printf("%d!=%ld.\n",m,mm);}longfacto(intx){longy;for(y=1;x>0;--x)y*=x;return(y);}函數(shù)執(zhí)行過程

main(){mm=facto(m);}facto(x){

return

(y);}調(diào)用返回函數(shù)調(diào)用共

67

頁第15

main(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d”,c);}[例7-4]intmax(intx,inty){intz;z=x>y?x:y;return(z);

}形參:通知系統(tǒng)要預(yù)留內(nèi)存位置.實參:在運行時把值傳給函數(shù).把函數(shù)的

結(jié)果賦給函數(shù)名形參與實參、函數(shù)名與返回值之間的關(guān)系共

67

頁第16

頁/*1*//*2*//*3*//*4*//*5*//*11*//*12*//*13*//*14*//*15*//*16*/main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf(”max=%d\n",c);}intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;return(z);}斷點保護斷點和現(xiàn)場,轉(zhuǎn)向11入口虛實結(jié)合a-x,b-y返回斷點恢復(fù)現(xiàn)場帶回函數(shù)值數(shù)據(jù)在函數(shù)間的傳遞共

67

頁第17

頁intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;return(z);}返回整型函數(shù)值intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;

return;}返回不確定的函數(shù)值

max(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;}無返回語句在此返回缺省類型說明

數(shù)據(jù)返回值共

67

頁第18

頁[例7-5]用函數(shù)計算浮點數(shù)x的n次方,其中n為int型(n>=0)doublepower(doublex,intn){doublep=1;inti;if(n>0)for(i=1;i<=n;i++)p=p*x;returnp;}main(){printf(“%lf”,power(3,5));}共

67

頁第19

值傳遞:

在函數(shù)調(diào)用時,實參將其值傳遞給形參。

實參對形參的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只由實參傳遞給形參,而不能由形參傳回來給實參。實參與形參占用不同的單元。7.1.5函數(shù)參數(shù)的傳遞方式

地址傳遞:將實參的地址傳遞給形參,實參和形參指向同一內(nèi)存空間,對形參的修改,可以直接影響實參。共

67

頁第20

頁[例7-6]編寫函數(shù)交換兩個變量的值。

#include“stdio.h”swap(int

x,int

y)

{int

temp;

temp=x;x=y;

y=temp;

printf("x=%d,y=%d\n",x,y);}main(){inta,b;a=5;b=10;printf("a=%d,b=%d\n",a,b);

swap(a,b);

printf("a=%d,b=%d\n",a,b);}運行結(jié)果:a=5,b=10x=10,y=5a=5,b=10共

67

頁第21

頁7.1.6函數(shù)的聲明問題的提出:C語言程序可由若干文件組成,每一個文件可以單獨編譯。若函數(shù)使用在定義之前,必須在調(diào)用函數(shù)前為編譯程序提供所用函數(shù)的返回值類型和參數(shù)的類型、個數(shù),以保證函數(shù)調(diào)用成功,就需要對函數(shù)聲明。

同變量一樣,函數(shù)的調(diào)用也應(yīng)該遵循“先說明,后使用”的原則。

函數(shù)聲明的一般形式:

類型標(biāo)識符函數(shù)名(類型1形參1,類型2形參2,……);功能:通知編譯程序函數(shù)值類型、參數(shù)個數(shù)及類型,為編譯程序進行類型檢查提供依據(jù)。共

67

頁第22

頁main(){

floatadd(floatx,floaty);

floata,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“sumis%f”,c);}/*定義add函數(shù)*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}對被調(diào)用函數(shù)的說明作為表達式被調(diào)用共

67

頁第23

頁3.函數(shù)聲明和函數(shù)定義的區(qū)別

函數(shù)聲明的作用是把函數(shù)的名字、函數(shù)類型以及形參的類型、個數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)按此進行對照檢查。

函數(shù)定義是指對函數(shù)功能的確立,包括指定函數(shù)名、函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。

函數(shù)聲明與函數(shù)定義的首部唯一區(qū)別:函數(shù)說明語句的()之后必須有分號,而函數(shù)定義頭部的()之后沒有分號。共

67

頁第24

頁4.可省略被調(diào)用函數(shù)聲明的三種情況⑴函數(shù)的返回值為整型或字符型時(按整型處理)main(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“maxis%d”,c);}max(intx,inty){intz;z=x>y?x:y;return(z);}建議都加以聲明共

67

頁第25

頁⑵被調(diào)用函數(shù)在主調(diào)函數(shù)之前定義floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b;scanf(“%f,%f”,&a,&b);printf(“sumis%f”,add(a,b));}共

67

頁第26

頁⑶在所有函數(shù)定義之前說明charletter(char,char);floatf(float,float);inti(float,float);main(){…….}charletter(charc1,charc2){……}floatf(floatx,floaty){……}inti(float,float){……}在所有函數(shù)之前說明函數(shù)類型定義函數(shù)letter、f和i共

67

頁第27

頁7.2數(shù)組作函數(shù)參數(shù)數(shù)組元素可以作函數(shù)的實參數(shù)組元素作為表達式的組成部分做函數(shù)的實參可以單向傳遞給形參。例如:

inta[10];······x=power(a[6],5);數(shù)組名可以作函數(shù)的實參和形參多維數(shù)組可以作函數(shù)參數(shù)共

67

頁第28

頁一維數(shù)組作函數(shù)參數(shù),形參的寫法為:

類型說明符形參數(shù)組名[數(shù)組長度]例如:floataverage(floatarray[10]) { … }main(){floatb[10];inti;for(i=0;i<10;i++)scanf(“%f”,&b[i]);…average(b);} 7.2.1一維數(shù)組作函數(shù)參數(shù)說明:形參和實參分別定義數(shù)組數(shù)組做函數(shù)參數(shù)時,實參應(yīng)用數(shù)組名,必須有確切值實參數(shù)組和形參數(shù)組類型應(yīng)一致。共

67

頁第29

頁說明:實參數(shù)組和形參數(shù)組大小不一定一致,形參數(shù)組可以不指定大小。(指一維數(shù)組)。數(shù)組名除作為變量的標(biāo)識外,還代表該數(shù)組在內(nèi)存中存放區(qū)域的首地址。數(shù)組名做函數(shù)實參與形參之間是“地址傳遞”,實參數(shù)組將數(shù)組的起始地址傳遞給形參數(shù)組。編譯系統(tǒng)不再為形參數(shù)組分配存儲單元。在函數(shù)體中對形參數(shù)組的元素操作時就是對實參數(shù)組的元素進行操作。形參數(shù)組各元素的值發(fā)生變化會使實參數(shù)組各元素的值發(fā)生同樣的變化。數(shù)組名作函數(shù)參數(shù)可實現(xiàn)大量數(shù)據(jù)的傳遞,無須返回數(shù)組值。共

67

頁第30

頁[例7-7]閱讀如下程序,給出打印結(jié)果

voidswap(inta[]){intt;t=a[0];a[0]=a[1];a[1]=t;}main(){intb[2]={1,2};swap(b);printf(“b[0]=%d,b[1]=%d\n”,b[0],b[1]);}結(jié)果:程序運行演示可不定義長度b數(shù)組a數(shù)組在調(diào)用函數(shù)過程中改變了原數(shù)組的值,實參數(shù)組與形參數(shù)組共享一組存儲空間,地址傳遞共

67

頁第31

頁[例7-8]編寫函數(shù)求n元數(shù)組的平均值。程序設(shè)計:

doubleaverage(inta[],intn){inti;doubles=0;for(i=0;i<n;i++)s=s+a[i];returns/n;}

主函數(shù)調(diào)用如何編寫?

用另外一個參數(shù)表示數(shù)組的長度共

67

頁第32

頁[例7-9]:用選擇法對數(shù)組中10個整數(shù)按由小到大排序.程序設(shè)計思想:函數(shù)sort(array[],n)

:實現(xiàn)數(shù)組元素由小到大排序。主程序:輸入array數(shù)組,調(diào)用sort函數(shù)比較,輸出排序后的array數(shù)組。voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])k=j;if(k!=i){t=array[k];array[k]=array[i];array[i]=t;}}}共

67

頁第33

頁main(){inta[10],i;printf(“enterarray:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);sort(a,10);printf(“thesortedarray:\n”);for(i=0;i<10;i++)printf(“%d”,a[i]);printf(“\n”);}由于地址傳遞,實參數(shù)組a改變數(shù)組名做參數(shù)的好處:⑴由于只需復(fù)制一個地址值,而無須復(fù)制全部需要處理的數(shù)據(jù),因此節(jié)約存儲空間并提高效率。⑵由于主調(diào)函數(shù)和被調(diào)函數(shù)是在相同的內(nèi)存區(qū)域上對數(shù)據(jù)進行操作,因此可以實現(xiàn)數(shù)據(jù)的同步更新。函數(shù)調(diào)用共

67

頁第34

頁7.2.2二維數(shù)組作函數(shù)參數(shù)二維數(shù)組作函數(shù)參數(shù),形參的寫法為:

類型說明符形參名[數(shù)組長度1][數(shù)組長度2]說明:形參數(shù)組定義時可以指定或省略第一維的大小例如:intarray[3][10];或intarray[][10];

intarray[3][];和intarray[][];錯誤

實參數(shù)組可以大于形參數(shù)組例如:實參數(shù)組定義為:intarray[5][10];

形參數(shù)組定義為:intarray[3][10];

這時形參數(shù)組只取實參數(shù)組的一部分,其余部分不起作用。共

67

頁第35

頁[例7-10]寫一函數(shù),求3*4矩陣中的最大值。

intmax_value(intarray[][4]){inti,j,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return(max);}main(){inta[3][4]={{1,3,5,7},{2,4,6,8},{10,12,15,17}};printf(“max=%d\n”,max_value(a));}函數(shù)調(diào)用共

67

頁第36

頁7.3函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.3.1函數(shù)的嵌套調(diào)用嵌套定義:在定義一個函數(shù)時,該函數(shù)體內(nèi)包含另一個函數(shù)的定義。嵌套調(diào)用:在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。

C語言不能嵌套定義,但可以嵌套調(diào)用!共

67

頁第37

頁main函數(shù)調(diào)用A函數(shù)結(jié)束A函數(shù)調(diào)用B函數(shù)B函數(shù)192873456

兩層嵌套的例子共

67

頁第38

頁7.3.2函數(shù)的遞歸調(diào)用f函數(shù)調(diào)用f函數(shù)1.遞歸的概念:在調(diào)用一個函數(shù)的過程中直接或間接地調(diào)用該函數(shù)本身。直接調(diào)用:intf(x)intx;{inty,z;……z=f(y);……return(2*z);}共

67

頁第39

頁intf1(x)intx;{inty,z;…..z=f2(y);……return(2*z);}intf2(t)intt;{inta,c;…..c=f1(a);……return(3+c);}間接調(diào)用:f1函數(shù)調(diào)用f2函數(shù)f2函數(shù)調(diào)用f1函數(shù)共

67

頁第40

頁遞歸函數(shù)的執(zhí)行過程:

--遞歸調(diào)用:記住本次現(xiàn)場,遞歸調(diào)用。

--終了調(diào)用:返回上次調(diào)用現(xiàn)場。特點:

--是無終止的遞歸調(diào)用,因此,應(yīng)該給定一個限制遞歸次數(shù)的條件。

--結(jié)構(gòu)簡練。共

67

頁第41

頁floatfac(intn){floatf;if(n<0)printf(“n<0,dataerror!\n”);elseif((n==0)||(n==1))f=1;elsef=fac(n-1)*n;returnf;}main(){intn;floatf;scanf(“%d”,&n);f=fac(n);printf("\n%d!=%f",n,f);}f(n)=1(n=1,0)f(n-1)*n(n>1)[例7-11]用遞歸法求n!調(diào)用階乘函數(shù)共

67

頁第42

頁遞歸函數(shù)fac的求解過程,以求5的階乘為例:f=5*fac(4)f=4*fac(3)f=2*fac(1)f=1f=5*fac(4)f=4*fac(3)f=2*1f=3*fac(2)f=3*2*1············向下遞推向上回歸共

67

頁第43

頁[例7-12]用遞歸法將一個整數(shù)n轉(zhuǎn)換成字符串。例如輸入256,應(yīng)輸出“256”,n的位數(shù)不固定,可以是任意位數(shù)的整數(shù)。voidtranvers(intn){if(n/10!=0)

tranvers(n/10);printf("%c",n%10+'0');}main(){intn;printf(“pleaseinputanintegralnumber”);scanf("%d",&n);if(n<0){printf(“-");n=-1*n;}

tranvers(n);}

67

頁第44

頁main()函數(shù)第一次調(diào)用tranvers函數(shù)遞歸函數(shù)tranvers的求解過程示意圖第二次調(diào)用tranvers函數(shù)第三次調(diào)用tranvers函數(shù)tranvers(25)printf("%c",n%10+'0');printf("%c",n%10+'0');輸出字符2tranvers(2)printf("%c",n%10+'0');輸出字符5輸出字符6tranvers(256)結(jié)束共

67

頁第45

頁變量的數(shù)據(jù)類型char型

int型

float型

double型總結(jié):數(shù)據(jù)類型決定為變量分配的內(nèi)存單元的長度,數(shù)據(jù)的存放形式。(從程序設(shè)計角度,決定了可以表示的數(shù)的范圍)問題:1.何時為變量分配內(nèi)存單元?

2.變量位于內(nèi)存的什么位置?

3.變量的有效作用范圍?7.4變量的作用域和存儲方法(VC++環(huán)境)共

67

頁第46

變量的作用域和生存期:

變量的作用域

指一個變量在程序中的有效范圍。(也稱為可見性)

C語言規(guī)定:凡是在函數(shù)內(nèi)定義的變量,它的作用域僅僅是本函數(shù)內(nèi);而在函數(shù)體外定義的變量,它的作用域是從定義點到文件尾。

變量的生存期

指程序在執(zhí)行期間,變量存在的時間間隔,即從給變量分配內(nèi)存,至所分配內(nèi)存被系統(tǒng)收回的那段時間。

67

頁第47

頁1.局部變量(內(nèi)部變量)定義:在函數(shù)內(nèi)部定義的變量,只能在本函數(shù)內(nèi)部使用。說明:主函數(shù)main定義的變量只在主函數(shù)中有效,主函數(shù)不能使用其它函數(shù)定義的變量。不同函數(shù)可以使用相同名字的變量。形式參數(shù)也是局部變量??梢栽谝粋€函數(shù)內(nèi)部,也可以在復(fù)合語句中定義變量;復(fù)合語句中定義的變量只在本復(fù)合語句中有效。7.4.1局部變量和全局變量charsearch(chars){charch;intk;…}變量s、ch、k的作用域編譯系統(tǒng)不為局部變量分配內(nèi)存單元,只是當(dāng)被調(diào)用時,根據(jù)需要分配臨時單元,調(diào)用結(jié)束,空間釋放。共

67

頁第48

頁例:main(){intm,n;……{intx,y;……}……}變量x,y的作用域變量m,n的作用域共

67

頁第49

頁2.全局變量定義:在函數(shù)之外定義的變量是全局變量(外部變量)。語法:類型說明變量名;使用范圍:可以為本文件中所有的函數(shù)公用。從定義變量的位置開始到本文件結(jié)束,這段程序中的函數(shù)可直接使用全局變量,inta,b=3;main(){…}floatk;charstr(chars[20]){…}全局變量a、b的作用域全局變量k的作用域共

67

頁第50

intp=1,q=5;/*外部變量*/f1(inta)/*定義函數(shù)*/

{intb,c;……}

charc1,c2;/*外部變量*/f2(inta,intb)/*定義函數(shù)*/

{…….}main(){intm,n……}全局變量c1、c2的作用范圍全局變量p、q的作用范圍共

67

頁第51

頁例如:#include“stdio.h”inta=7,b=10;main(){inta=5,c;c=a+b;printf(“c=%d\n”,c);}

在同一源文件中,全局變量和局部變量可以同名,在局部變量的作用范圍內(nèi),全局變量不起作用。C=15全局變量局布變量局部變量全局變量共

67

頁第52

頁優(yōu)點:函數(shù)間數(shù)據(jù)聯(lián)系:同一文件中的一些函數(shù)引用全局變量,當(dāng)某個函數(shù)中改變了全局變量的值,其它函數(shù)中的全局變量值也隨之改變。函數(shù)可以得到多個返回值。缺點:全局變量在程序的全部執(zhí)行過程中都占用存儲單元。降低函數(shù)的通用性。使用過多,降低程序的清晰性。全局變量應(yīng)盡可能少用。

67

頁第53

變量的存儲類別靜態(tài)存儲方式:程序運行期間分配固定存儲空間的方式。動態(tài)存儲方式:程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間的方式。程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量,局部靜態(tài)變量形式參數(shù)局部變量(自動)函數(shù)調(diào)用的現(xiàn)場保護和返回地址7.4.2變量的存儲方法共

67

頁第54

頁動態(tài)存儲變量特點

函數(shù)開始調(diào)用時為變量分配存儲空間,函數(shù)結(jié)束時釋放這些空間。靜態(tài)存儲變量特點

在靜態(tài)存儲區(qū)分配存儲單元,整個程序運行期間都不釋放。變量存貯類型有四種:自動變量(auto)靜態(tài)變量(static)外部變量(extern)寄存器變量(register)

auto、static、extern和register為存貯類型說明符。共

67

頁第55

頁(1)自動變量(auto)

函數(shù)中的局部變量,不做任何存儲類別的說明都為自動變量。定義形式:[auto]類型說明符變量名;

說明:·“auto”可以省略。

·以前所使用的全部變量都是自動變量。

·自動變量必須在一個函數(shù)體的內(nèi)部。

·

函數(shù)的形參也是自動變量。例如:intb,c=3等價于

autointb,c=3;

作用域:包含變量定義的復(fù)合語句或所說明的函數(shù)內(nèi)部;在函數(shù)被調(diào)用時才存在,從函數(shù)中返回時即消失,值也僅限于說明它的函數(shù),在其它的函數(shù)中不能存取,

在兩個不同的函數(shù)中可以分別使用同名的變量。1.局部變量的存儲方法共

67

頁第56

頁(2)局部靜態(tài)變量定義形式:在變量名前面加關(guān)鍵字static

static類型說明符變量名;局部靜態(tài)變量編譯時賦初值,每次調(diào)用時不賦初值,只保留調(diào)用結(jié)束時變量的值。如果不賦初值,編譯時自動賦0值。局部靜態(tài)變量只允許所在函數(shù)引用,其它函數(shù)不能引用。其值整個程序運行期間都不釋放。自動變量不賦初值,其值不確定。每調(diào)用一次,重新賦值一次。共

67

頁第57

頁例如:f(inta){intb=0;staticintc=3;b=b+1;c=c+1;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf(“%d,”,f(a));}運行結(jié)果為:

7,8,9第一次調(diào)用開始第一次調(diào)用結(jié)束第二次調(diào)用開始0b34410c局部靜態(tài)變量共

67

頁第58

頁(3)寄存器變量(register)

直接放置在運算器的寄存器中的變量稱為寄存器變量.

定義形式:

register類型說明符變量名;作用:對于使用頻繁的變量,定義為寄存器變量,不必從內(nèi)存而是直接從寄存器中取出參加運算,提高程序執(zhí)行效率。說明:只有局部自動變量和形式參數(shù)可作為寄存器變量,其它如局部靜態(tài)變量和全局變量不可以。屬于動態(tài)存儲方式,函數(shù)開始調(diào)用時為變量分配寄存器空間,函數(shù)結(jié)束時釋放寄存器空間。只有int、char和指針類型可定義為寄存器變量,而long、double和float型變量不能設(shè)定為寄存器型??捎糜谧兞靠臻g分配的寄存器個數(shù)依賴于具體的機器。通常為2到3個,若在一個函數(shù)中說明多于2到3個寄存器變量,編譯程序會自動地將它們變?yōu)樽詣幼兞?。?/p>

67

頁第59

頁2.全局變量的存儲類型(兩種:外部全局變量、靜態(tài)全局變量)(1)外部全局變量

在多個源程序文件的情況下,如果在一個文件中要引用在其它文件中定義的全局變量,則應(yīng)該在需要引用此變量的文件中,用extern做說明。例如:

prog1.c的內(nèi)容如下:inta;main(){x=6;f1();}voidf1(){a+=2;printf("a=%d\n",a);f2();}prog2.c的內(nèi)容為:externinta;voidf2(){a++;printf("a=%d\n",a);}共

67

頁第60

頁(2)靜態(tài)全局變量

在一個文件中定義的全局變量僅限于本文件引用,而不能被其它文件訪問,則可以定義為靜態(tài)全局變量。例如:staticintx;

說明:外部全局變量與靜態(tài)全局變量在同一文件內(nèi)的作用域一樣;外部全局變量可以被多

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論