課件第8章函數(shù)_第1頁
課件第8章函數(shù)_第2頁
課件第8章函數(shù)_第3頁
課件第8章函數(shù)_第4頁
課件第8章函數(shù)_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第七八章

數(shù)組函數(shù)

南旅院工程技術(shù)系楊峰趙嬌鳳構(gòu)造數(shù)據(jù)類型之一數(shù)組:有序數(shù)據(jù)的集合,用數(shù)組名標(biāo)識元素:屬同一數(shù)據(jù)類型,用數(shù)組名和下標(biāo)確定7.1

一維數(shù)組一維數(shù)組的定義定義方式:數(shù)據(jù)類型數(shù)組名[常量表達(dá)式];

合法標(biāo)識符表示元素個(gè)數(shù)下標(biāo)從0開始[]:數(shù)組運(yùn)算符單目運(yùn)算符優(yōu)先級(1)左結(jié)合不能用()例inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a編譯時(shí)分配連續(xù)內(nèi)存內(nèi)存字節(jié)數(shù)=數(shù)組維數(shù)*sizeof(元素?cái)?shù)據(jù)類型)數(shù)組名表示內(nèi)存首地址,是地址常量一維數(shù)組的引用數(shù)組必須先定義,后使用只能逐個(gè)引用數(shù)組元素,不能一次引用整個(gè)數(shù)組數(shù)組元素表示形式:數(shù)組名[下標(biāo)]其中:下標(biāo)可以是常量或整型表達(dá)式例inti=15;intdata[i];(不能用變量定義數(shù)組維數(shù))例intdata[5];data[5]=10;//C語言對數(shù)組不作越界檢查,使用時(shí)要注意一維數(shù)組的初始化初始化方式在定義數(shù)組時(shí),為數(shù)組元素賦初值(在編譯階段使之得到初值)inta[5]={1,2,3,4,5};等價(jià)于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;說明:數(shù)組不初始化,其元素值為隨機(jī)數(shù)對static數(shù)組元素不賦初值,系統(tǒng)會自動(dòng)賦以0值當(dāng)全部數(shù)組元素賦初值時(shí),可不指定數(shù)組長度如inta[5]={6,2,3};

等價(jià)于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};(

)staticinta[5];等價(jià)于:a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;只給部分?jǐn)?shù)組元素賦初值

inta[]={1,2,3,4,5,6};編譯系統(tǒng)根據(jù)初值個(gè)數(shù)確定數(shù)組維數(shù)程序舉例例讀10個(gè)整數(shù)存入數(shù)組,找出其中最大值和最小值步驟:1.輸入:for循環(huán)輸入10個(gè)整數(shù)2.處理:(a)先令max=min=x[0](b)依次用x[i]和max,min比較(循環(huán))若max<x[i],令max=x[i]

若min>x[i],令min=x[i]3.輸出:max和min#include<stdio.h>#defineSIZE10main(){intx[SIZE],i,max,min;printf("Enter10integers:\n");for(i=0;i<SIZE;i++){printf("%d:",i+1); scanf("%d",&x[i]);}max=min=x[0];for(i=1;i<SIZE;i++){if(max<x[i])max=x[i];if(min>x[i])min=x[i];}printf("Maximumvalueis%d\n",max);printf("Minimumvalueis%d\n",min);}

主要內(nèi)容8.1概述

8.2函數(shù)定義的一般形式

8.3函數(shù)參數(shù)和函數(shù)的值

8.4函數(shù)的調(diào)用

8.5函數(shù)的嵌套調(diào)用

8.6函數(shù)的遞歸調(diào)用

8.7數(shù)組作為函數(shù)參數(shù)

8.8局部變量和全局變量

8.9變量的存儲類別

8.10內(nèi)部函數(shù)和外部函數(shù)

8.1概述

一個(gè)C程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成。一個(gè)較大的程序可分為若干個(gè)程序模塊,每一個(gè)模塊用來實(shí)現(xiàn)一個(gè)特定的功能。在高級語言中用子程序?qū)崿F(xiàn)模塊的功能。子程序由函數(shù)來完成。函數(shù)間的調(diào)用關(guān)系:由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。例8.1先舉一個(gè)函數(shù)調(diào)用的簡單例子#include<stdio.h>voidmain(){voidprintstar();/*對printstar函數(shù)聲明*/voidprint_message();/*對print_message函數(shù)聲明*/printstar();/*調(diào)用printstar函數(shù)*/

print_message();/*調(diào)用print_message函數(shù)*/printstar();/*調(diào)用printstar函數(shù)*/voidprintstar()/*定義printstar函數(shù)*/{printf("****************\n");}voidprint_message()/*定義print_message函數(shù)*/{printf("Howdoyoudo!\n");運(yùn)行情況如下:****************Howdoyoudo!****************}

說明:

(1)一個(gè)C程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對于較大的程序,通常將程序內(nèi)容分別放在若干個(gè)源文件中,再由若干源程序文件組成一個(gè)C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可以為多個(gè)C程序公用。(2)

一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其他有關(guān)內(nèi)容(如命令行、數(shù)據(jù)定義等)組成。一個(gè)源程序文件是一個(gè)編譯單位,在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。(3)C程序的執(zhí)行是從main函數(shù)開始的,如果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。(4)所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是分別進(jìn)行的,是互相獨(dú)立的。一個(gè)函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義。函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是系統(tǒng)調(diào)用的。(5)從用戶使用的角度看,函數(shù)有兩種:①

標(biāo)準(zhǔn)函數(shù),即庫函數(shù)。這是由系統(tǒng)提供的,用戶不必自己定義這些函數(shù),可以直接使用它們。不同的C系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會有一些不同,但許多基本的函數(shù)是共同的。②用戶自己定義的函數(shù)。用以解決用戶的專門需要。

(6)從函數(shù)的形式看,函數(shù)分兩類:①無參函數(shù)。無參函數(shù)一般用來執(zhí)行指定的一組操作。在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。②有參函數(shù)。主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時(shí),通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)。

8.2函數(shù)定義的一般形式

8.2.1無參函數(shù)的定義一般形式

定義無參函數(shù)的一般形式為:類型標(biāo)識符函數(shù)名(){

聲明部分

語句部分}

8.2.2有參函數(shù)定義的一般形式

定義有參函數(shù)的一般形式為:類型標(biāo)識符函數(shù)名(形式參數(shù)表列){

聲明部分

語句部分}例如:intmax(intx,inty){intz;/*函數(shù)體中的聲明部分*/z=x>y?x∶y;

return(z);}

8.2.3空函數(shù)

定義空函數(shù)的一般形式為:類型標(biāo)識符函數(shù)名(){}例如:dummy(){}主調(diào)函數(shù)調(diào)用空函數(shù)時(shí),只表明這里要調(diào)用一個(gè)函數(shù),但函數(shù)本身什么工作也不做等,以后擴(kuò)充函數(shù)功能時(shí)補(bǔ)充上。

8.3函數(shù)參數(shù)和函數(shù)的值

8.3.1形式參數(shù)和實(shí)際參數(shù)

形式參數(shù):函數(shù)名后面括號中的變量名稱為“形式參數(shù)”(簡稱“形參”)。實(shí)際參數(shù):主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號中的參數(shù)(可以是一個(gè)表達(dá)式)稱為“實(shí)際參數(shù)”(簡稱“實(shí)參”)。函數(shù)返回值:return后面的括號中的值作為函數(shù)帶回的值(稱函數(shù)返回值)。

主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞的關(guān)系。在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的方法有:參數(shù):通過形式參數(shù)和實(shí)際參數(shù)返回值:用return語句返回計(jì)算結(jié)果全局變量:外部變量例8.2調(diào)用函數(shù)時(shí)的數(shù)據(jù)傳遞#include<stdio.h>voidmain(){intmax(intx,inty);

/*對max函數(shù)的聲明*/inta,b,c;

scanf("%d,%d",&a,&b);c=max(a,b);

printf("Maxis%d",c);}

intmax(intx,inty)/*定義有參函數(shù)max*/{

intz;z=x>y?x∶y;

return(z);}

運(yùn)行情況如下:7,8↙Max

is

通過函數(shù)調(diào)用,可使兩個(gè)函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系。關(guān)于形參與實(shí)參的說明:(1)在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲單元。只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max中的形參才被分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。(2)實(shí)參可以是常量、變量或表達(dá)式,例如:

max(3,a+b);但要求它們有確定的值。在調(diào)用時(shí)將實(shí)參的值賦給形參。(3)在被定義的函數(shù)中,必須指定形參的類型。(4)實(shí)參與形參的類型應(yīng)相同或賦值兼容。(5)值傳遞:實(shí)參向形參的數(shù)據(jù)傳遞是單向“值傳遞”,只能由實(shí)參傳給形參,而不能由形參傳回來給實(shí)參。

在調(diào)用函數(shù)時(shí),給形參分配存儲單元,并將實(shí)參對應(yīng)的值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。

8.3.2函數(shù)的返回值

函數(shù)的返回值是通過函數(shù)調(diào)用使主調(diào)函數(shù)得到的確定值。例如:例8.2中,max(2,3)的值是3,max(5,2)的值是5。賦值語句將這個(gè)函數(shù)值賦給變量c。說明:

(1)函數(shù)的返回值是通過函數(shù)中的return語句獲得的。一個(gè)函數(shù)中可以有一個(gè)以上的return語句,執(zhí)行到哪一個(gè)return語句,哪一個(gè)語句起作用。return語句后面的括弧也可以不要例如:

“returnz;”等價(jià)于“return(z);”return后面的值可以是一個(gè)表達(dá)式。例如:

max(intx,inty){

return(x>y?x:y);

}(2)函數(shù)的返回值應(yīng)當(dāng)屬于某一個(gè)確定的類型,在定義函數(shù)時(shí)指定函數(shù)返回值的類型。例如:下面是3個(gè)函數(shù)的首行:int

max(floatx,floaty)/*函數(shù)值為整型*/char

letter(charc1,charc2)/*函數(shù)值為字符型*/

double

min(intx,inty)/*函數(shù)值為雙精度型

*/

注意:凡不加類型說明的函數(shù),自動(dòng)按整型處理。(3)在定義函數(shù)時(shí)指定的函數(shù)類型一般應(yīng)該和return語句中的表達(dá)式類型一致。如果函數(shù)值的類型和return語句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。對數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值的類型。(4)對于不帶回值的函數(shù),應(yīng)當(dāng)用“void”定義函數(shù)為“無類型”(或稱“空類型”)。此時(shí)在函數(shù)體中不得出現(xiàn)return語句。

例8.3返回值類型與函數(shù)類型不同#include<stdio.h>voidmain(){intmax(floatx,floaty);

floata,b;

intc;

scanf("%f,%f,",&a,&b);c=max(a,b);

printf("Maxis%d\n",c);}intmax(floatx,floaty){floatz;/*z為實(shí)型變量*/

z=x>y?x∶y;

return(z);}運(yùn)行情況如下:1.5,2.5↙

Maxis2

8.4函數(shù)的調(diào)用

8.4.1函數(shù)調(diào)用的一般形式函數(shù)調(diào)用的一般形式為:

函數(shù)名(實(shí)參表列)說明:(1)如果是調(diào)用無參函數(shù),則“實(shí)參表列”可以沒有,但括弧不能省略。(3)如果實(shí)參表列包括多個(gè)實(shí)參,對實(shí)參求值的順序并不是確定的,有的系統(tǒng)按自左至右順序求實(shí)參的值,有的系統(tǒng)則按自右至左順序。(2)如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號隔開。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配。實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。例8.4實(shí)參求值的順序#include<stdio.h>voidmain(){intf(inta,intb);/*函數(shù)聲明*/inti=2,p;p=f(i,++i);/*函數(shù)調(diào)用*/printf("%d\n",p);}

intf(inta,intb)/*函數(shù)定義*/{intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}

如果按自左至右順序求實(shí)參的值,則函數(shù)調(diào)用相當(dāng)于f(2,3)

如果按自右至左順序求實(shí)參的值,則函數(shù)調(diào)用相當(dāng)于f(3,3)

對于函數(shù)調(diào)用

inti=2,p;p=f(i,++i);

8.4.2函數(shù)調(diào)用的方式1.函數(shù)語句把函數(shù)調(diào)用作為一個(gè)語句。這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。2.函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例如:c=2*max(a,b);

按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下三種函數(shù)調(diào)用方式:

3.函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。例如:m=max(a,max(b,c));其中max(b,c)是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實(shí)參。m的值是a、b、c三者中的最大者。8.4.3對被調(diào)用函數(shù)的聲明和函數(shù)原型在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?1.首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)。但光有這一條件還不夠。3.如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面,應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)作聲明。2.如果使用庫函數(shù),還應(yīng)該在本文件開頭用#include命令將調(diào)用有關(guān)庫函數(shù)時(shí)所需用到的信息“包含”到本文件中來。函數(shù)原型的一般形式為:1.函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2……);2.函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2……);

聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時(shí),編譯系統(tǒng)能正確識別函數(shù)并檢查調(diào)用是否合法。注意:

函數(shù)的“定義”和“聲明”的區(qū)別:函數(shù)的定義是指對函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。函數(shù)的聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對照檢查。例8.5對被調(diào)用的函數(shù)作聲明#include<stdio.h>voidmain(){floatadd(floatx,floaty);

/*對被調(diào)用函數(shù)add的聲明*/

floata,b,c;

scanf("%f,%f",&a,&b);

c=add(a,b);printf("sumis%f\n",c);}floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體*/z=x+y;

return(z);}例8.5對被調(diào)用的函數(shù)作聲明#include<stdio.h>floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體*/z=x+y;

return(z);}voidmain(){

floata,b,c;

scanf("%f,%f",&a,&b);

c=add(a,b);printf("sumis%f\n",c);}

8.7數(shù)組作為函數(shù)參數(shù)

8.7.1數(shù)組元素作函數(shù)實(shí)參

由于實(shí)參可以是表達(dá)式,而數(shù)組元素可以是表達(dá)式的組成部分,因此數(shù)組元素可以作為函數(shù)的實(shí)參,與用變量作實(shí)參一樣,是單向傳遞,即“值傳送”方式。

8.7.2數(shù)組名作函數(shù)參數(shù)

用數(shù)組名作函數(shù)參數(shù)時(shí),此時(shí)形參應(yīng)當(dāng)用數(shù)組名或用指針變量。例8.11有一個(gè)一維數(shù)組score,內(nèi)放10個(gè)學(xué)生成績,求平均成績。#include<stdio.h>voidmain(){floataverage(floatarray[10]);/*函數(shù)聲明*/floatscore[10],aver;

inti;

printf(″input10scores:\n″);

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

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

printf(″\n″);

aver=average(score);

printf(″averagescoreis%5.2f\n″,aver);}floataverage(floatarray[10]){inti;

floataver,sum=array[0];

for(i=1;i<10;i++=)sum=sum+array[i];aver=sum/10;

return(aver);}運(yùn)行情況如下:input10scores:

100567898.576879967.57597↙

averagescoreis83.40

例8.12形參數(shù)組不定義長度#include<stdio.h>voidmain(){floataverage(floatarray[],intn)

floatscore_1[5]={98.5,97,91.5,60,55};

floatscore_2[10]={67.5,89.5,99,69.5,

77,89.5,76.5,54,60,99.5};

printf(“theaverageofclassAis%6.2f\n”,

average(score_1,5));printf(“theaverageofclassBis%6.2f\n”,

average(score_2,10));

}floataverage(floatarray[],intn){inti;

floataver,sum=array[0];

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

sum=sum+array[i];

aver=sum/n;

return(aver);}運(yùn)行結(jié)果如下:theaverageofclassAis80.40TheaverageofclassBis78.20例8.13用選擇法對數(shù)組中10個(gè)整數(shù)按由小到大排序。

所謂選擇法就是先將10個(gè)數(shù)中最小的數(shù)與a[0]對換;再將a[1]到a[9]中最小的數(shù)與a[1]對換……每比較一輪,找出一個(gè)未經(jīng)排序的數(shù)中最小的一個(gè)。共比較9輪。未排序時(shí)的情況:a[0]a[1]a[2]a[3]a[4]36194將5個(gè)數(shù)中最小的數(shù)1與a[0]對換:16394將余下的4個(gè)數(shù)中最小的數(shù)3與a[1]對換

13694將余下的3個(gè)數(shù)中最小的數(shù)4與a[2]對換

13496將余下的2個(gè)數(shù)中最小的數(shù)6與a[3]對換

13469程序:#include<stdio.h>voidmain(){voidsort(intarray[],intn);inta[10],i;

printf(″e(cuò)nterthearray\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″);}voidsort(intarray[],intn)/*排序函數(shù)*/{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;t=array[k];

array[k]=array[i];array[i]=t

}}

8.7.3.多維數(shù)組名作函數(shù)參數(shù)程序:#include<stdio.h>voidmain(){max_value(intarray[][4]);int[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};

printf(″maxvalueis%d\n″,

max_value(a));}

用多維數(shù)組名作為函數(shù)實(shí)參和形參。在被調(diào)函數(shù)中對形參數(shù)組定義時(shí)可以指定每一維的大小。max_value(intarray[][4]){inti,j,k,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);}

運(yùn)行結(jié)果如下:Maxvalueis34

8.8局部變量和全局變量

8.8.1局部變量內(nèi)部變量:在一個(gè)函數(shù)內(nèi)部定義的變量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)有效,即:只有在本函數(shù)內(nèi)才能使用這些變量,故稱為“局部變量”。例:floatf1(inta)/*函數(shù)f1*/{intb,c;…/*a、b、c有效*/}charf2(intx,inty)/*函數(shù)f2*/{inti,j;/*x、y、i、j有效*/}voidmain()/*主函數(shù)*/{intm,n;…/*m、n有效*/}

主函數(shù)中定義的變量只在主函數(shù)中有效,而不因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。(2)不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,互不干擾。(3)形式參數(shù)也是局部變量。(4)在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也稱為“分程序”或“程序塊”。voidmain(){inta,b;…{intc;c=a+b;c在此范圍內(nèi)有效a,b在此范圍內(nèi)有效

…}…}

8.8.2全局變量外部變量:函數(shù)之外定義的變量稱為外部變量。外部變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。所以也稱全程變量。intp=1,q=5;/*外部變量*/floatf1(inta)/*定義函數(shù)f1*/{intb,c;…}charc1,c2;/*外部變量*/charf2(intx,inty)/*定義函數(shù)f2*/{inti,j;全局變量p,q的作用范圍

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

例8.15有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生成績,寫一個(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);

}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);}運(yùn)行情況如下:9945789710067.589926643↙max=100.00min=43.00average=77.65

建議:不必要時(shí)不要使用全局變量,原因如下:①全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時(shí)才開辟單元。②使用全局變量過多,會降低程序的清晰性。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量的值,程序容易出錯(cuò)。因此,要限制使用全局變量。③降低函數(shù)的通用性。因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。如果將一個(gè)函數(shù)移到另一個(gè)文件中,還要將有關(guān)的外部變量及其值一起移過去。但若該外部變量與其他文件的變量同名時(shí),就會出現(xiàn)問題,降低了程序的可靠性和通用性。一般要求把C程序中的函數(shù)做成一個(gè)封閉體,除了可以通過“實(shí)參——形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。例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);

}運(yùn)行結(jié)果為

8

8.9變量的存儲類別

8.9.1動(dòng)態(tài)存儲方式與靜態(tài)存儲方式

從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。從變量值存在的時(shí)間角度來分,又可以分為靜態(tài)存儲方式和動(dòng)態(tài)存儲方式。靜態(tài)存儲方式:指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲空間的方式。動(dòng)態(tài)存儲方式:則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲空間的方式。這個(gè)存儲空間可以分為三部分:1.程序區(qū)2.靜態(tài)存儲區(qū)3.動(dòng)態(tài)存儲區(qū)

變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方式。存儲方式分為兩大類:靜態(tài)存儲類和動(dòng)態(tài)存儲類。包含:自動(dòng)的(auto);靜態(tài)的(static);寄存器的(register);外部的(extern)。根據(jù)變量的存儲類別,可以知道變量的作用域和生存期。8.9.2auto變量自動(dòng)變量auto:不專門聲明為static存儲類別的局部變量都是動(dòng)態(tài)分配存儲空間,在調(diào)用該函數(shù)時(shí)系統(tǒng)會給它們分配存儲空間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)釋放這些存儲空間。因此這類局部變量稱為自動(dòng)變量。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量),都屬此類。自動(dòng)變量用關(guān)鍵字auto作存儲類別的聲明。例如:intf(inta)/*定義f函數(shù),a為形參*/{autointb,c=3;/*定義b、c為自動(dòng)變量*/

…}8.9.3用static聲明局部變量

當(dāng)函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值時(shí),該變量稱為靜態(tài)局部變量。用關(guān)鍵字static進(jìn)行聲明。例8.17

考察靜態(tài)局部變量的值#include<stdio.h>voidmain(){intf(int);inta=2,i;

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

printf(″%d″,f(a));}intf(inta){autointb=0;

staticc=3;b=b+1;c=c+1;

return(a+b+c);}對靜態(tài)局部變量的說明:(1)靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲類別,占動(dòng)態(tài)存儲區(qū)空間而不占靜態(tài)存儲區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2)對靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。(3)如在定義局部變量時(shí)不賦初值的話,則對靜態(tài)局部變量來說,編譯時(shí)自動(dòng)賦初值0(對數(shù)值型變量)或空字符(對字符變量)。而對自動(dòng)變量來說,如果不賦初值則它的值是一個(gè)不確定的值。(4)雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)不能引用它。例8.18

輸出1到5的階乘值#include<stdio.h>voidmain(){intfac(intn);inti;

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

printf(″%d!=%d\n″,i,fac(i));}Intfac(intn){staticintf=1;f=f*n;

return(f);}8.9.4register變量

變量的值是存放在內(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)存存放。

如果有一些變量使用頻繁,則為存取變量的值要花費(fèi)不少時(shí)間。為提高執(zhí)行效率,C語言允許將局部變量的值放在CPU中的寄存器中,需要用時(shí)直接從寄存器取出參加運(yùn)算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。例8.19使用寄存器變量#include<stdio.h>voidmain(){longfac(long);longi,n;scanf("%ld",&n);for(i=1;i<=n;i++)printf("%ld!=%ld\n",i,fac(i));}longfac(longn){registerlongi,f=1;/*定義寄存器變量*/for(i=1;i<=n;i++)f=f*i;return(f);}8.9.5用extern聲明外部變量

外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲區(qū)。用extern來聲明外部變量,以擴(kuò)展外部變量的作用城。1.在一個(gè)文件內(nèi)聲明外部變量例8.20用extern聲明外部變量,擴(kuò)展它在程序文件中的作用域#include<stdio.h>voidmain(){intmax(int,int);/*外部變量聲明*/

externA,B;printf("%d\n",max(A,B));}intA=13,B=-8;/*定義外部變量*/

intmax(intx,inty)/*定義max函數(shù)*/{intz;z=x>y?x:y;return(z);}2.在多文件的程序中聲明外部變量#include<stdio.h>intA;/*定義外部變量*/voidmain(){intpower(int);/*函數(shù)聲明*/intb=3,c,d,m;

printf(″e(cuò)nterthenumberaanditspowerm:\n″);

scanf(″%d,%d″,&A,&m);c=A*b;

printf(″%d*%d=%d\n″,A,b,c);d=power(m);

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

例8.21用extern將外部變量的作用域擴(kuò)展到其他文件。本程序的作用是給定b的值,輸入a和m,求a×b和am的值。文件file1.c中的內(nèi)容為:文件file2.c中的內(nèi)容為:externA;/*聲明A為一個(gè)已定義的外部變量*/intpowre(intn);{inti,y=1;

for(i=1;i<=n;i++)y*=A;

return(y);}8.9.6用static聲明外部變量在程序設(shè)計(jì)中,某些外部變量只限于被本文件引用,而不能被其他文件引用。這時(shí)可以在定義外部變量時(shí)加一個(gè)staitic聲明。例如:file1.cfile2.cstaticintA;externintA;voidmain()voidfun(intn){{……A=A*n;}8.9.7關(guān)于變量的聲明和定義定義性聲明:需要建立存儲空間的(如:inta;)聲明。引用性聲明:不需建立存儲空間的聲明(externa;)。注意:聲明包括定義,但并非所有的聲明都是定義。對“inta;”而言,它既是聲明,又是定義。而對“externa;”而言,它是聲明而不是定義。

8.9.8存儲類別小結(jié)從作用域角度分,有局部變量和全局變量。它們采用的存儲類別如下:局部變量包括:自動(dòng)變量、靜態(tà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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論