C語(yǔ)言程序設(shè)計(jì)(第四章)_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第四章)_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第四章)_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第四章)_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第四章)_第5頁(yè)
已閱讀5頁(yè),還剩67頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

主講:楊林第四章函數(shù)C源程序由函數(shù)組成,C語(yǔ)言稱(chēng)為函數(shù)式語(yǔ)言函數(shù)是C源程序的基本模塊C采用了函數(shù)模塊式的結(jié)構(gòu),易于實(shí)現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì),有利于團(tuán)隊(duì)開(kāi)發(fā),有利于軟件的維護(hù)與函數(shù)的可重用性。函數(shù)可分為庫(kù)函數(shù)和用戶(hù)定義函數(shù)兩種。庫(kù)函數(shù):由C系統(tǒng)提供,用戶(hù)無(wú)須定義,只需在程序前包含有該函數(shù)原型的頭文件用戶(hù)定義函數(shù):由用戶(hù)按需要編寫(xiě)的函數(shù)函數(shù)概述4.1

函數(shù)的定義與調(diào)用在C語(yǔ)言中,在一個(gè)函數(shù)的函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù),也就是不能嵌套定義函數(shù)。函數(shù)之間允許相互調(diào)用,習(xí)慣上將調(diào)用者稱(chēng)為主調(diào)函數(shù),被調(diào)用者稱(chēng)為被調(diào)函數(shù)。main()函數(shù)是主函數(shù),它可以調(diào)用其它函數(shù),但不允許被其它函數(shù)調(diào)用。C程序的執(zhí)行總是從main()函數(shù)開(kāi)始,完成對(duì)其它函數(shù)的調(diào)用后再返回到main()函數(shù),正常情況下,最后由main()函數(shù)結(jié)束整個(gè)程序。4.1.1

函數(shù)定義的一般形式1.無(wú)參函數(shù)定義的一般形式無(wú)參函數(shù)定義的一般形式如下:返回類(lèi)型函數(shù)名(void){

函數(shù)體}其中“返回類(lèi)型函數(shù)名(void)”稱(chēng)為函數(shù)首部。返回類(lèi)型指明了本函數(shù)返回值的類(lèi)型,有時(shí)也稱(chēng)函數(shù)類(lèi)型。返回類(lèi)型也可以是void,表示沒(méi)有返回值。C89標(biāo)準(zhǔn)中,若沒(méi)有返回類(lèi)型,則默認(rèn)為int類(lèi)型。函數(shù)名是由用戶(hù)定義的標(biāo)識(shí)符。{}中的內(nèi)容稱(chēng)為函數(shù)體。建議:自定義的函數(shù)名首字母大寫(xiě),用以區(qū)別庫(kù)函數(shù)。例4.1無(wú)參函數(shù)示例。#include<stdio.h> /*標(biāo)準(zhǔn)輸入/出頭文件*/#include<stdlib.h> /*包含庫(kù)函數(shù)system()所需信息*/voidHello(void) /*函數(shù)首部*/{ printf("Hello,world!\n"); /*輸出"Hello,world!"*/}intmain(void) /*主函數(shù)main()*/{ Hello(); /*調(diào)用函數(shù)Hello()*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}程序運(yùn)行時(shí)屏幕輸出如下:

Hello,world!

請(qǐng)按任意鍵繼續(xù)...2.有參函數(shù)的一般形式有參函數(shù)定義的一般形式如下: 返回類(lèi)型函數(shù)名(形式參數(shù)表) {

函數(shù)體

}有參函數(shù)比無(wú)參函數(shù)多了形式參數(shù)表,形參表格式如下: 類(lèi)型名1形式參數(shù)1,類(lèi)型名2形式參數(shù)2,…在進(jìn)行函數(shù)調(diào)用時(shí),主調(diào)函數(shù)將賦予這些形式參數(shù)實(shí)際的值。例4.2有參函數(shù)示例。intMax(inta,intb) /*函數(shù)首部*/{ returna>b?a:b; /*返回a,b的最大值*/}intmain(void) /*主函數(shù)main()*/{ inta,b,m; /*定義變量*/ printf("輸入a,b:"); /*輸入提示*/ scanf(“%d,%d",&a,&b); /*輸入a,b*/ m=Max(a,b); /*調(diào)用函數(shù)求最大值*/ printf("最大值:%d\n",m); /*輸出最大值*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}程序運(yùn)行時(shí)屏幕輸出參考如下: 輸入a,b:23

最大值:3

請(qǐng)按任意鍵繼續(xù)...4.1.2函數(shù)調(diào)用的一般形式在程序中是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體,在C語(yǔ)言中,函數(shù)調(diào)用的一般形式為:

函數(shù)名(實(shí)際參數(shù)表);對(duì)無(wú)參函數(shù)調(diào)用時(shí)無(wú)實(shí)際參數(shù)表,但括號(hào)不能省。實(shí)際參數(shù)表中的參數(shù)可以是常數(shù),變量或表達(dá)式。各實(shí)參之間用逗號(hào)分隔。在C語(yǔ)言中,可以用以下幾種方式調(diào)用函數(shù):函數(shù)表達(dá)式:函數(shù)作為表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。

如:a=Max(x,y,z)/2;函數(shù)語(yǔ)句:函數(shù)調(diào)用的一般形式加上分號(hào)即構(gòu)成函數(shù)語(yǔ)句。

如:printf(“Helloworld!\n”);對(duì)返回類(lèi)型為void的函數(shù),只能采用函數(shù)語(yǔ)句的形式調(diào)用,不能參與運(yùn)算或賦值給變量。4.1.3函數(shù)的聲明和函數(shù)原型在一個(gè)函數(shù)(即主調(diào)函數(shù))中調(diào)用另一個(gè)函數(shù)(即被調(diào)函數(shù))需具備如下條件:被調(diào)用的函數(shù)必須是已經(jīng)定義的函數(shù)(庫(kù)函數(shù)或用戶(hù)自定義的函數(shù))。如果使用庫(kù)函數(shù),還應(yīng)在本文件開(kāi)頭用#include命令將調(diào)用有關(guān)庫(kù)函數(shù)時(shí)所需用到的信息“包含”到本文件中來(lái)。如果使用用戶(hù)自己定義的函數(shù),而此函數(shù)的位置在調(diào)用它的函數(shù)的后面,則應(yīng)在調(diào)用函數(shù)前對(duì)被調(diào)用函數(shù)作聲明。例4.3對(duì)被調(diào)用函數(shù)的聲明示例。intmain(void) /*主函數(shù)main()*/{

intMin(inta,intb); /*對(duì)被調(diào)用函數(shù)的聲明*/ inta,b,m; /*定義變量*/ printf("輸入a,b:"); /*輸入提示*/ scanf("%d%d",&a,&b); /*輸入a,b*/ m=Min(a,b); /*調(diào)用函數(shù)求最小值*/ printf("最小值:%d\n",m); /*輸出最小值*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}intMin(inta,intb) /*函數(shù)首部*/{ returna<b?a:b; /*返回a,b的最小值*/}程序運(yùn)行時(shí)屏幕輸出參考如下: 輸入a,b:23

最小值:2

請(qǐng)按任意鍵繼續(xù)...例4.4在主調(diào)用函數(shù)前對(duì)被調(diào)用函數(shù)的聲明示例。intMax(inta,intb); /*對(duì)被調(diào)用函數(shù)的聲明*/intmain(void) /*主函數(shù)main()*/{ inta,b,m; /*定義變量*/ printf("輸入a,b:"); /*輸入提示*/ scanf("%d%d",&a,&b); /*輸入a,b*/ m=Max(a,b); /*調(diào)用函數(shù)求最大值*/ printf("最大值:%d\n",m); /*輸出最大值*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}intMax(inta,intb) /*函數(shù)首部*/{ returna<b?a:b; /*返回a,b的最大值*/}程序運(yùn)行時(shí)屏幕輸出參考如下: 輸入a,b:23

最大值:3

請(qǐng)按任意鍵繼續(xù)...對(duì)函數(shù)的聲明與函數(shù)定義中的函數(shù)首部基本上是相同的,只多了一個(gè)分號(hào)。因此可以簡(jiǎn)單地照寫(xiě)已定義的函數(shù)的首部,再加一個(gè)分號(hào),就成為了對(duì)函數(shù)的“聲明”。函數(shù)聲明也稱(chēng)為函數(shù)原型。編譯系統(tǒng)并不檢查函數(shù)聲明中的參數(shù)名,只檢查參數(shù)類(lèi)型。因此參數(shù)名是什么都無(wú)所謂,所以函數(shù)聲明中的參數(shù)名可以不寫(xiě),如上面程序中的聲明也可以寫(xiě)成:intMax(int,int); /*對(duì)被調(diào)用函數(shù)的聲明,可 不寫(xiě)參數(shù)名,只寫(xiě)參數(shù)類(lèi)型*/4.2

函數(shù)的參數(shù)和函數(shù)的值4.2.1函數(shù)的參數(shù)函數(shù)的參數(shù)分為形參和實(shí)參兩種:形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,離開(kāi)函數(shù)則自動(dòng)失效,不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送(復(fù)制)給被調(diào)函數(shù)的形參。函數(shù)的形參和實(shí)參具有以下特點(diǎn):形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),立即釋放所分配的內(nèi)存單元。實(shí)參可以是常量、變量、表達(dá)式等,實(shí)參必須具有確定的值,以便將這些值傳送給形參。實(shí)參和形參在數(shù)量上,類(lèi)型上,順序上應(yīng)一致,否則可能會(huì)發(fā)生“類(lèi)型不匹配”的錯(cuò)誤。函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。例4.5形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化示例。voidSum(intn); /*聲明函數(shù)sum()*/intmain(void) /*主函數(shù)main()*/{ intn; /*整型變量*/ printf("輸入n:"); /*輸入提示*/ scanf("%d",&n); /*輸入n*/ Sum(n); /*求1+2+3+...+n*/ printf("n:%d\n",n); *顯示n的值*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}voidSum(intn){ inti; /*整型變量*/ for(i=n-1;i>=1;i--) n=n+i; /*循環(huán)求和*/ printf("n:%d\n",n); /*顯示和*/}程序運(yùn)行時(shí)屏幕輸出參考如下: 輸入n:10 n:55 n:10

請(qǐng)按任意鍵繼續(xù)...本例的形參變量和實(shí)參變量的標(biāo)識(shí)符都為n,但這是兩個(gè)不同的變量,各自的作用域不同4.2.2函數(shù)的返回值函數(shù)的返回值指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的程序段后返回給主調(diào)用函數(shù)的值。對(duì)函數(shù)的值(或稱(chēng)函數(shù)返回值)有以下一些說(shuō)明:函數(shù)的返回值只能通過(guò)return語(yǔ)句返回給主調(diào)函數(shù)。return語(yǔ)句的一般形式為:

return表達(dá)式;或 return(表達(dá)式);說(shuō)明:對(duì)于一個(gè)函數(shù),每次只能使用一個(gè)return語(yǔ)句,只能返回一個(gè)函數(shù)值。函數(shù)返回值的類(lèi)型應(yīng)和主調(diào)函數(shù)中的類(lèi)型保持一致。4.2.2函數(shù)的返回值如果兩者不一致,則以函數(shù)類(lèi)型為準(zhǔn),自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。如函數(shù)返回值為整型,在函數(shù)定義時(shí)可以省去類(lèi)型說(shuō)明。不返回值的函數(shù),可以定義為“空類(lèi)型”,類(lèi)型說(shuō)明符為“void”。如果函數(shù)中沒(méi)有ruturn語(yǔ)句,則執(zhí)行到函數(shù)最后一條語(yǔ)句后自動(dòng)返回到主調(diào)函數(shù)。4.3

函數(shù)的嵌套調(diào)用C語(yǔ)言中允許在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)。這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用,在被調(diào)函數(shù)中可以又調(diào)用其它函數(shù)。除main函數(shù)外,每一個(gè)函數(shù)都可以調(diào)用其他函數(shù)或被其他函數(shù)調(diào)用。例4.6計(jì)算s=(2!)2+(3!)2+(4!)2。本題可編寫(xiě)兩個(gè)函數(shù),一個(gè)是用來(lái)計(jì)算階乘平方值的函數(shù)f1(),另一個(gè)是用來(lái)計(jì)算階乘值的函數(shù)f2()。主函數(shù)先調(diào)用f1()計(jì)算出階乘平方值,在循環(huán)程序中計(jì)算累加和。longf1(longn){ intk,r; /*整型變量*/ longf2(long); /*函數(shù)聲明*/ k=f2(n); /*調(diào)用函數(shù)f2()*/

r=k*k; /*求k的平方*/ returnr; /*返回r*/}longf2(longn){ longt=1; /*累乘積*/ inti; /*整型變量*/ for(i=1;i<=n;i++) t=t*i; /*循環(huán)求積*/ returnt; /*返回t*/}……程序運(yùn)行時(shí)屏幕輸出如下:

s=616

請(qǐng)按任意鍵繼續(xù)...4.4

函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用是指函數(shù)直接或間接對(duì)自已進(jìn)行調(diào)用,在C語(yǔ)言中,數(shù)學(xué)上的迭代函數(shù)一般都可以用遞歸方法進(jìn)行編程。例4.7用遞歸求累加和1+2+3+…+n。求累加和1+2+3+…+n可用迭代公式表示如下:用可遞歸編程如下:intSum(intn) /*用遞歸求和1+2+...+n*/{ if(n>0)returnn+Sum(n-1); /*遞歸調(diào)用*/ elsereturn0; /*遞歸結(jié)束*/}intmain(void) /*主函數(shù)main()*/{ intn; /*定義變量*/ printf("請(qǐng)輸入一個(gè)非負(fù)整數(shù)n:"); /*輸入提示*/ scanf("%d",&n); /*輸入n*/ printf("累加和為%d.\n",Sum(n)); /*輸出累加和*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}程序運(yùn)行時(shí)屏幕輸出參考如下: 請(qǐng)輸入一個(gè)非負(fù)整數(shù)n:5

累加和為15.

請(qǐng)按任意鍵繼續(xù)...下面對(duì)遞歸函數(shù)Sum()進(jìn)行分析,可以先考慮基本情況,然后再由基本情況推算其他情況函數(shù)調(diào)用返回值Sum(0)0Sum(1)1+Sum(0),即1+0Sum(2)2+Sum(1),即2+1+0Sum(3)3+Sum(2),即3+2+1+0Sum(4)4+Sum(3),即4+3+2+1+0Sum(5)5+Sum(4),即5+4+3+2+1+0簡(jiǎn)單遞歸通常都有對(duì)函數(shù)的入口進(jìn)行測(cè)試的基本情況,上例中n==0就是基本情況,然后再將函數(shù)中的一個(gè)變量的表達(dá)式作為參數(shù)進(jìn)行遞歸調(diào)用上例中遞歸調(diào)用Sum(n-1),最終將遞歸情況演化為基本情況,上例每次將n的值減1,直到n等于0的基本情況為止。一般遞歸具有如下的形式:

if(<遞歸結(jié)束條件>) { /*遞歸結(jié)束條件成立,結(jié)束遞歸調(diào)用*/

遞歸結(jié)束處理方面的語(yǔ)句; } else { /*遞歸結(jié)束條件不成立,繼續(xù)進(jìn)行遞歸調(diào)用*/

遞歸調(diào)用方面的語(yǔ)句; }或:

if(<遞歸調(diào)用條件>) { /*遞歸調(diào)用條件成立,繼續(xù)進(jìn)行遞歸調(diào)用*/

遞歸調(diào)用方面的語(yǔ)句; } [else { /*遞歸調(diào)用條件不成立,結(jié)束遞歸調(diào)用*/

遞歸結(jié)束處理方面的語(yǔ)句; }]上面的括號(hào)“[]”中的部分是可省略的部分#include<stdio.h>voidfun(intx){if(x/2>1)fun(x/2);printf("%d",x);}main(){fun(7);printf("\n");}以上程序運(yùn)行結(jié)果?#include<stdio.h>intf(intx);main(){intn=1,m;m=f(f(f(n)));printf("%d\n",m);}intf(intx){returnx*2;}以上程序運(yùn)行結(jié)果?4.5

變量的作用域形參變量只在被調(diào)用期間才分配內(nèi)存單元,調(diào)用結(jié)束立即釋放,表明形參變量只有在函數(shù)內(nèi)才是有效的,離開(kāi)該函數(shù)就不能再使用了變量有效性的范圍稱(chēng)變量的作用域不僅對(duì)于形參變量,C語(yǔ)言中所有的變量都有自己的作用域按作用域范圍可分為兩種局部變量全局變量4.5.1局部變量局部變量也稱(chēng)為內(nèi)部變量。在函數(shù)內(nèi)作定義說(shuō)明的變量是局部變量。局部變量作用域僅限于函數(shù)內(nèi),離開(kāi)該函數(shù)后再使用這種變量是非法的。關(guān)于局部變量的作用域還要說(shuō)明以下幾點(diǎn):主函數(shù)中定義的變量只能在主函數(shù)中使用,不能在其它函數(shù)中使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的變量。形參變量是屬于被調(diào)函數(shù)的局部變量,實(shí)參變量是屬于主調(diào)函數(shù)的局部變量。允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,被分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆在復(fù)合語(yǔ)句中也可定義變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)。例4.8作用域示例。intmain(void) /*主函數(shù)main()*/{ inti=2,j=3,k; /*定義變量i,j,k*/ k=i+j; /*求和*/ { /*復(fù)合語(yǔ)句*/ intk=8; /*定義變量k*/ printf("%d\n",k); /*輸出k*/ } printf("%d,%d\n",i,k); /*輸出i,k*/

system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}程序運(yùn)行時(shí)屏幕輸出如下:

8 2,5

請(qǐng)按任意鍵繼續(xù)...4.5.2全局變量全局變量也稱(chēng)為外部變量,在函數(shù)外部定義的變量是全局變量。全局變量不屬于哪一個(gè)函數(shù),而屬于一個(gè)源程序文件。其作用域是整個(gè)源程序。在函數(shù)中使用全局變量,一般應(yīng)作全局變量聲明。全局變量的說(shuō)明符為extern。在一個(gè)函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用可不再加以說(shuō)明

例4.9輸入正方體的長(zhǎng)寬高l,w,h。求體積及三個(gè)面的面積。ints1,s2,s3; /*三個(gè)面的面積*/intGetVolArea(intl,intw,inth){ intv; /*定義變量v*/ v=l*w*h; /*計(jì)算體積*/ s1=l*w; /*計(jì)算面積*/ s2=l*h; /*計(jì)算面積*/ s3=w*h; /*計(jì)算面積*/ returnv; /*返回體積*/}intmain(void) /*主函數(shù)main()*/{ intv,l,w,h; /*定義變量v,l,w,h*/ printf("輸入長(zhǎng),寬和高:"); /*輸入提示*/ scanf("%d%d%d",&l,&w,&h); /*輸入長(zhǎng),寬和高*/ v=GetVolArea(l,w,h); /*計(jì)算體積的面積*/ printf("v=%ds1=%ds2=%ds3=%d\n",v,s1,s2,s3); /*輸出體積的面積*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}程序運(yùn)行時(shí)屏幕輸出參考如下: 輸入長(zhǎng),寬和高:234 v=24s1=6s2=8s3=12

請(qǐng)按任意鍵繼續(xù)...C語(yǔ)言規(guī)定函數(shù)返回值只有一個(gè),當(dāng)需要增加函數(shù)的返回?cái)?shù)據(jù)時(shí),用外部變量是一種很好的方式對(duì)于全局變量還有以下幾點(diǎn)說(shuō)明:外部變量的定義和外部變量的聲明并不是一回事。外部變量定義必須在所有的函數(shù)之外,且只能定義一次。其一般形式為: 變量類(lèi)型變量名1,變量名2,…; 例如

: intm,n;

在整個(gè)程序內(nèi),外部變量的聲明可能出現(xiàn)多次,外部變量說(shuō)明的一般形式為:

extern

變量類(lèi)型變量名1,變量名2,…;

外部變量在定義時(shí)就已分配了內(nèi)存單元,外部變量定義可作初始賦值,外部變量的聲明不能再賦初始值,只是表明在函數(shù)內(nèi)要使用某外部變量外部變量可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系(耦合性),但使得函數(shù)的獨(dú)立性降低。在不必要時(shí)盡量不要使用全局變量。在同一源文件中,允許全局變量和局部變量同名。在局部變量的作用域內(nèi),全局變量不起作用。例4.10已知正方體的長(zhǎng)寬高l,w,h。求體積。intGetVol(intl,intw) { externinth; /*聲明全局變量h*/ intv; /*定義變量v*/ v=l*w*h; /*計(jì)算體積*/ returnv; /*返回體積*/}intmain(void) /*主函數(shù)main()*/{ externintw,h; /*聲明全局變量w,h*/ intl=5; /*定義變量l*/ printf("v=%d\n",GetVol(l,w)); /*輸出體積*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}intl=6,w=8,h=10; /*定義全局變量l,w,h*/程序運(yùn)行時(shí)屏幕輸出如下:

v=400

請(qǐng)按任意鍵繼續(xù)...4.6

變量的存儲(chǔ)類(lèi)型和生存期存儲(chǔ)類(lèi)型是指變量占用內(nèi)存空間的方式,也稱(chēng)為存儲(chǔ)方式,變量的存儲(chǔ)方式可分為:靜態(tài)存儲(chǔ)動(dòng)態(tài)存儲(chǔ)靜態(tài)存儲(chǔ)變量通常在變量定義時(shí)就分配存儲(chǔ)單元并一直保留到整個(gè)程序結(jié)束。4.5.2節(jié)中介紹的全局變量就屬于此類(lèi)存儲(chǔ)方式動(dòng)態(tài)存儲(chǔ)變量是在程序執(zhí)行過(guò)程中,使用它時(shí)才分配存儲(chǔ)單元,使用完畢立即釋放。典型的例子是函數(shù)的形式參數(shù),在函數(shù)定義時(shí)并不給形參分配存儲(chǔ)單元,只是在函數(shù)被調(diào)用時(shí),才予以分配,調(diào)用函數(shù)完畢立即釋放。生存期表示變量存在的時(shí)間。生存期和作用域是從時(shí)間和空間這兩個(gè)不同的角度來(lái)描述變量的特性。在C語(yǔ)言中,對(duì)變量的存儲(chǔ)類(lèi)型說(shuō)明有以下四種:auto(自動(dòng)變量)register(寄存器變量)extern(外部變量)static(靜態(tài)變量)。自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部變量和靜態(tài)變量屬于靜態(tài)存儲(chǔ)方式對(duì)一個(gè)變量的說(shuō)明不僅應(yīng)說(shuō)明其數(shù)據(jù)類(lèi)型,還應(yīng)說(shuō)明其存儲(chǔ)類(lèi)型。因此變量說(shuō)明的完整形式應(yīng)為:存儲(chǔ)類(lèi)型數(shù)據(jù)類(lèi)型變量名1,變量名2…;例如:staticinta,b;

/*說(shuō)明a,b為靜態(tài)類(lèi)型變量*/autocharc1,c2;

/*說(shuō)明c1,c2為自動(dòng)字符變量*/externintx,y;

/*說(shuō)明x,y為外部整型變量*/4.6.1自動(dòng)變量自動(dòng)變量的類(lèi)型說(shuō)明符為auto,函數(shù)內(nèi)凡未加存儲(chǔ)類(lèi)型說(shuō)明的變量均視為自動(dòng)變量,也就是說(shuō)自動(dòng)變量可省去說(shuō)明符autointFun(void){ inti,j,k; /*定義變量i,j,k*/ charc; /*定義變量c*/ ……}等價(jià)于:intFun(void){ autointi,j,k; /*定義變量i,j,k*/ autocharc; /*定義變量c*/ ……}自動(dòng)變量具有以下特點(diǎn):自動(dòng)變量的作用域僅限于定義該變量的模塊內(nèi)。自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式,只有在使用時(shí),也就是定義此變量的函數(shù)被調(diào)用時(shí)才給它分配存儲(chǔ)單元,開(kāi)始它的生存期。函數(shù)調(diào)用結(jié)束,釋放存儲(chǔ)單元,生存期結(jié)束。在復(fù)合語(yǔ)句中定義的自動(dòng)變量,在退出復(fù)合語(yǔ)句后也不能再使用。例4.11復(fù)合語(yǔ)句中定義的自動(dòng)變量示例。intmain(void) /*主函數(shù)main()*/{ autointa; /*定義自動(dòng)變量a*/ printf("輸入a:"); /*輸入提示*/ scanf("%d",&a); /*輸入a*/ if(a>0) { autoints,p; /*復(fù)合語(yǔ)句內(nèi)定義自動(dòng)變量s,p*/ s=a+a; /*求和*/ p=a*a; /*求積*/ printf("s=%dp=%d\n",s,p); /*輸出s,p*/ }

printf(“s=%dp=%d\n”,s,p); /*錯(cuò)誤,在復(fù)合語(yǔ)句外,s,p無(wú)效*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}程序運(yùn)行時(shí)屏幕輸出參考如下: 輸入a:8 s=16p=64

請(qǐng)按任意鍵繼續(xù)...自動(dòng)變量的作用域和生存期都局限于定義它的個(gè)體內(nèi)(函數(shù)或復(fù)合語(yǔ)句內(nèi)),不同的個(gè)體中允許使用同名的變量不會(huì)混淆。例4.12函數(shù)內(nèi)定義的自動(dòng)變量與該函數(shù)內(nèi)部的復(fù)合語(yǔ)句中定義的自動(dòng)變量同名示例。intmain(void) /*主函數(shù)main()*/{ autointa,s=600,p=600; /*定義自動(dòng)變量a,s,p*/ printf("輸入a:"); /*輸入提示*/ scanf("%d",&a); /*輸入a*/ if(a>0) { autoints,p; /*復(fù)合語(yǔ)句內(nèi)定義自動(dòng)變量s,p*/

s=a+a; /*求和*/

p=a*a; /*求積*/ printf("s=%dp=%d\n",s,p); /*輸出s,p*/ } printf("s=%dp=%d\n",s,p); /*輸出s,p*/

system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}程序運(yùn)行時(shí)屏幕輸出參考如下: 輸入a:8 s=16p=64 s=600p=600

請(qǐng)按任意鍵繼續(xù)...4.6.2外部變量外部變量的類(lèi)型說(shuō)明符為extern。當(dāng)一個(gè)源程序由若干個(gè)源文件組成時(shí),在一個(gè)源文件中定義的外部變量在其它的源文件中也有效。例如:/*文件名:f1.c*/inta,b; /*定義外部變量*/charc; /*定義外部變量*/intmain(void) /*主函數(shù)main()*/{ ……}/*文件名:f2.c*/externinta,b; /*聲明外部變量*/externcharc; /*聲明外部變量*/Func(intx,y){ ……}4.6.3靜態(tài)變量靜態(tài)變量的類(lèi)型說(shuō)明符是static。靜態(tài)變量屬于靜態(tài)存儲(chǔ)方式。外部變量雖屬于靜態(tài)存儲(chǔ)方式,但不一定是靜態(tài)變量,必須由static加以定義后才能成為靜態(tài)外部變量,或稱(chēng)靜態(tài)全局變量。對(duì)于在函數(shù)內(nèi)或復(fù)合語(yǔ)句中定義的變量,可以用static定義它為靜態(tài)變量,或稱(chēng)靜態(tài)局部變量。1.靜態(tài)局部變量在局部變量的說(shuō)明前再加上static說(shuō)明符就構(gòu)成靜態(tài)局部變量。例如:staticinta,b; /*定義靜態(tài)變量*/靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)方式,具有以下特點(diǎn):靜態(tài)局部變量在函數(shù)或復(fù)合語(yǔ)句內(nèi)定義,靜態(tài)局部變量始終存在著,也就是生存期為整個(gè)程序。靜態(tài)局部變量的生存期雖然為整個(gè)程序,但是其作用域?yàn)槎x該變量的函數(shù)或復(fù)合語(yǔ)句。對(duì)基本類(lèi)型的靜態(tài)局部變量若在說(shuō)明時(shí)未賦以初值,則系統(tǒng)自動(dòng)賦予0值。而對(duì)自動(dòng)變量不賦初值,則其值是隨機(jī)的。靜態(tài)局部變量是一種生存期為整個(gè)程序的量。雖離開(kāi)定義它的函數(shù)后不能使用,但如再次調(diào)用定義它的函數(shù)時(shí),它又可繼續(xù)使用,而且保存了前次被調(diào)用后留下的值。例4.13靜態(tài)局部變量示例。intmain(void) /*主函數(shù)main()*/{ inti; /*定義自動(dòng)變量*/ voidf(); /*聲明函數(shù)*/ for(i=1;i<=5;i++) f(); /*循環(huán)調(diào)用函數(shù)f()*/ system("PAUSE"); /*輸出系統(tǒng)提示信息*/ return0; /*返回值0,返回操作系統(tǒng)*/}voidf(){ staticintcount=0; /*定義靜態(tài)局部變量*/ ++count; /*計(jì)數(shù)*/ printf("%d\n",count); /*顯示count*/}count為靜態(tài)局部變量,能在每次調(diào)用后保留其值并在下一次調(diào)用時(shí)繼續(xù)使用,所以輸出值成為累加的結(jié)果程序運(yùn)行時(shí)屏幕輸出如下:

1 2 3 4 5

請(qǐng)按任意鍵繼續(xù)...2.靜態(tài)全局變量全局變量(外部變量)的說(shuō)明之前再冠以static就構(gòu)成了靜態(tài)全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量顯然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無(wú)不同。當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論