![4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計_第1頁](http://file4.renrendoc.com/view/bc00c0b9748f1150e05c083b62cd72f6/bc00c0b9748f1150e05c083b62cd72f61.gif)
![4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計_第2頁](http://file4.renrendoc.com/view/bc00c0b9748f1150e05c083b62cd72f6/bc00c0b9748f1150e05c083b62cd72f62.gif)
![4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計_第3頁](http://file4.renrendoc.com/view/bc00c0b9748f1150e05c083b62cd72f6/bc00c0b9748f1150e05c083b62cd72f63.gif)
![4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計_第4頁](http://file4.renrendoc.com/view/bc00c0b9748f1150e05c083b62cd72f6/bc00c0b9748f1150e05c083b62cd72f64.gif)
![4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計_第5頁](http://file4.renrendoc.com/view/bc00c0b9748f1150e05c083b62cd72f6/bc00c0b9748f1150e05c083b62cd72f65.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
教學(xué)內(nèi)容: 第1章:C語言語法基礎(chǔ)第2章:C程序設(shè)計基礎(chǔ)第3章:利用數(shù)組處理同類型的批量數(shù)據(jù)第4章:利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計第5章:靈活使用指針第6章:結(jié)構(gòu)體、共用體、枚舉類型及其應(yīng)用第7章:常用的三種線性數(shù)據(jù)結(jié)構(gòu)第8章:利用文件進(jìn)行數(shù)據(jù)管理第9章:嵌入式技術(shù)基礎(chǔ)實(shí)踐方法C語言程序設(shè)計【學(xué)習(xí)內(nèi)容】4.1函數(shù)概述
4.2定義函數(shù)的方法
4.3函數(shù)的調(diào)用
4.4數(shù)組作為函數(shù)參數(shù)
4.5變量的類型
4.6內(nèi)部函數(shù)和外部函數(shù)4.7嵌入式中斷服務(wù)函數(shù)第4章利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計【學(xué)習(xí)目標(biāo)】1.掌握定義函數(shù)的方法;
2.理解函數(shù)參數(shù)傳遞及函數(shù)返回值的概念;
3.掌握函數(shù)的3種調(diào)用方法;
4.掌握普通變量和數(shù)組作為函數(shù)參數(shù)的方法;
5.理解并區(qū)別變量的類型;
6.掌握內(nèi)部函數(shù)和外部函數(shù)的概念;
7.熟悉中斷和嵌入式中斷服務(wù)函數(shù)的概念。4.1函數(shù)概述
一個復(fù)雜的C程序由若干個程序模塊組成,每個程序模塊作為一個源程序文件(.c文件、.h文件等),而每個源程序文件由預(yù)處理命令、數(shù)據(jù)聲明以及若干函數(shù)組成。
一個C程序必須有且只能有一個主函數(shù),C程序總是從主函數(shù)開始執(zhí)行(不論位置如何),最后在主函數(shù)中結(jié)束整個程序的運(yùn)行。需要注意:在主函數(shù)中可以調(diào)用其他函數(shù),而不允許被其他函數(shù)調(diào)用。
在實(shí)際應(yīng)用的C程序中,可將主函數(shù)設(shè)計得簡單些,主要負(fù)責(zé)調(diào)用各個功能函數(shù),依次實(shí)現(xiàn)各項(xiàng)功能——模塊化程序設(shè)計。4.1函數(shù)概述
從不同的角度對函數(shù)進(jìn)行分類。1.從定義函數(shù)的角度
(1)庫函數(shù):由編譯系統(tǒng)提供,只要在源文件中包含其對應(yīng)的頭文件,即可在程序中直接調(diào)用【見附錄D】。例如,“stdio.h”頭文件中的printf、scanf等函數(shù),“math.h”頭文件中的sin、cos等函數(shù)。
(2)用戶自定義函數(shù):用戶根據(jù)需要,將實(shí)現(xiàn)某個功能的代碼編寫成相對獨(dú)立的函數(shù)。2.從有無返回值的角度
(1)有返回值函數(shù):向調(diào)用者返回一個值。定義函數(shù)時須指明函數(shù)的類型(函數(shù)返回值的類型)。
(2)無返回值函數(shù):不向調(diào)用者返回函數(shù)值。定義函數(shù)時應(yīng)指定函數(shù)的類型為void。3.從數(shù)據(jù)傳遞的角度
(1)無參函數(shù):調(diào)用時,主調(diào)函數(shù)和被調(diào)函數(shù)之間不進(jìn)行參數(shù)傳送。此類函數(shù)可以返回或不返回函數(shù)值。
(2)有參函數(shù):調(diào)用時,主調(diào)函數(shù)將實(shí)參的值傳遞給形參(虛參)。4.2定義函數(shù)的方法4.2.1定義無參函數(shù)定義形式:類型標(biāo)識符函數(shù)名(void){
聲明部分 執(zhí)行部分}函數(shù)首部函數(shù)體函數(shù)的類型(函數(shù)返回值的類型)表示函數(shù)沒有參數(shù),也可省略不寫例如:intfun(void){ inti,j;
intsum=0; i=2;j=3; sum=i+j; retrun(sum);}
聲明執(zhí)行說明:(1)書寫函數(shù)體時,一般先寫聲明部分,后寫執(zhí)行部分。若將前3行寫成:inti,j;//聲明語句i=2;j=3;//執(zhí)行語句intsum=0;//聲明語句系統(tǒng)編譯不通過!(2)若函數(shù)無需返回值,則函數(shù)類型應(yīng)定義為void類型。例如:
voidHello(){ printf("Helloworld\n");}函數(shù)返回值(變量sum)的類型4.2定義函數(shù)的方法4.2.2定義有參函數(shù)定義形式:
類型標(biāo)識符函數(shù)名(形參列表){
聲明部分 執(zhí)行部分}
形參可以是各種類型的變量。若有多個形參,則各形參之間要用逗號分隔。在函數(shù)調(diào)用時,主調(diào)函數(shù)將實(shí)參的值傳遞給形參。注意:必須在形參列表中給出形參的類型標(biāo)識符。例如:
intmax(intx,inty)
{
intz;
if(x>y)z=x;
return(z);
}
有返回值的函數(shù)中至少應(yīng)有一個return語句。形參:整型變量x、y,其具體值由主調(diào)函數(shù)調(diào)用時傳遞過來將z的值作為函數(shù)值返回給主調(diào)函數(shù)函數(shù)返回值(變量z)的類型4.3函數(shù)的調(diào)用4.3.1函數(shù)的一般調(diào)用
函數(shù)的一般調(diào)用流程:
函數(shù)被定義之后,即可被其他函數(shù)調(diào)用。本節(jié)將介紹函數(shù)的一般調(diào)用、嵌套調(diào)用和遞歸調(diào)用3種調(diào)用方式。1、函數(shù)的一般調(diào)用形式
(2)有參函數(shù)的調(diào)用形式:函數(shù)名(實(shí)參列表)
(1)無參函數(shù)的調(diào)用形式:函數(shù)名()
例如,4.2.1節(jié)中的Hello函數(shù)調(diào)用語句可寫為:Hello();
調(diào)用有參函數(shù)時,主調(diào)函數(shù)將“實(shí)參”的值傳遞給被調(diào)函數(shù)的“形參”,從而實(shí)現(xiàn)信息傳遞。如果有多個實(shí)參,則各參數(shù)之間要用逗號隔開。實(shí)參與形參的個數(shù)應(yīng)相等,類型應(yīng)匹配,按順序?qū)?yīng),一一傳遞信息。4.3函數(shù)的調(diào)用4.3.1函數(shù)的一般調(diào)用1、函數(shù)的一般調(diào)用形式
【例4.1】有參函數(shù)的一般調(diào)用:求兩個數(shù)的最大值。c=max(a,b);
(main函數(shù))intmax(int
x,int
y)(max函數(shù)){
intz; if(x>y)z=x; elsez=y;
return(z);
}#include<stdio.h>intmax(intx,inty);
//對max函數(shù)進(jìn)行聲明intmain(void){ inta,b,c;printf("請輸入2個整數(shù):");scanf("%d%d",&a,&b);c=max(a,b);//調(diào)用max函數(shù)printf("a=%d,b=%d,max=%d\n",a,b,c);}intmax(intx,inty)
//定義有參函數(shù){
intz;if(x>y)z=x;elsez=y;
return(z);//向主調(diào)函數(shù)返回z的值
}4.3函數(shù)的調(diào)用2、關(guān)于函數(shù)調(diào)用時“參數(shù)傳遞”
的幾點(diǎn)說明4.3.1函數(shù)的一般調(diào)用
(1)形參變量只有在發(fā)生函數(shù)調(diào)用時才被臨時分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占用的內(nèi)存單元也被釋放。實(shí)參與形參占用不同的存儲空間。
(2)只能由實(shí)參傳遞給形參,而不能由形參傳遞給實(shí)參,即“單向信息傳遞”。在執(zhí)行一個被調(diào)函數(shù)時,形參的值如果發(fā)生改變,并不會改變主調(diào)函數(shù)的實(shí)參值。
(3)當(dāng)形參為普通變量(基本類型的變量)時,實(shí)參可以是常量、變量或表達(dá)式,但必須有確定的值。形參:x函數(shù)調(diào)用時被調(diào)函數(shù)執(zhí)行時實(shí)參:a1b3y1324【例4.2】函數(shù)參數(shù)傳遞。#include<stdio.h>voidfun(intx,inty);
//對fun函數(shù)進(jìn)行聲明intmain(void){ inta=1,b=3;
fun(a,
b);
//調(diào)用fun函數(shù)printf("a=%d,b=%d\n",a,b);}voidfun(intx,inty)
//定義有參函數(shù){ x=x+1;
y=y+1;printf("x=%d,y=%d\n",x,y);}4.3函數(shù)的調(diào)用3、函數(shù)的值(3)沒有返回值的函數(shù),函數(shù)的類型應(yīng)當(dāng)明確定義為void類型。(1)函數(shù)的值只能通過return語句獲得。
return語句的一般形式:return表達(dá)式;
或return(表達(dá)式);
(2)函數(shù)返回值的類型和定義函數(shù)時指定的函數(shù)類型應(yīng)保持一致。定義函數(shù)時若不指定函數(shù)類型,C編譯系統(tǒng)則默認(rèn)為整型。
說明:在函數(shù)中可有多個return語句,但每次調(diào)用只能有一個return語句被執(zhí)行,因此只能返回一個函數(shù)值。return語句也可以不含表達(dá)式,此時必須將函數(shù)定義為void類型,其作用只是使流程返回到主調(diào)函數(shù)。4.3.1函數(shù)的一般調(diào)用練習(xí):【例4.3】輸入一個非負(fù)整數(shù),輸出它的倒序數(shù)。4.3函數(shù)的調(diào)用4、對被調(diào)函數(shù)的聲明
在例4.1和例4.2的主調(diào)函數(shù)(主函數(shù))的前面,都對被調(diào)函數(shù)進(jìn)行了聲明。若不進(jìn)行聲明,編譯系統(tǒng)對程序從上到下進(jìn)行編譯的過程中,遇到被調(diào)函數(shù)名時,就會認(rèn)為是一個“陌生人”而報告錯誤。解決辦法有兩個。
(1)在主調(diào)函數(shù)的函數(shù)體的開始,或者在源文件中所有函數(shù)的前面,對被調(diào)函數(shù)進(jìn)行聲明。提前向編譯系統(tǒng)“打招呼”,讓編譯系統(tǒng)“提前認(rèn)識”被調(diào)函數(shù)。
(2)若在主調(diào)函數(shù)前面定義被調(diào)函數(shù),則無須額外對被調(diào)函數(shù)進(jìn)行聲明。或:
類型標(biāo)識符函數(shù)名(形參類型1,形參類型2,…);
函數(shù)聲明(也稱為函數(shù)原型)的一般形式:
類型標(biāo)識符函數(shù)名(形參類型1形參名1,形參類型2形參名2,
…);
在函數(shù)首部的基礎(chǔ)上加一分號4.3.1函數(shù)的一般調(diào)用4.3函數(shù)的調(diào)用4、對被調(diào)函數(shù)的聲明
4.3.1函數(shù)的一般調(diào)用提倡使用說明:調(diào)用庫函數(shù)時,無需對其進(jìn)行聲明,但要把該函數(shù)對應(yīng)的頭文件用#include命令包含在源文件中。4.3函數(shù)的調(diào)用4.3.2函數(shù)的嵌套調(diào)用
在C語言中,所有函數(shù)(包括主函數(shù))都是相互平行、相互獨(dú)立的。在一個函數(shù)內(nèi)不能再定義另一個函數(shù)(函數(shù)不能嵌套定義)。但允許在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù),即函數(shù)的嵌套調(diào)用?!纠?.4】函數(shù)的嵌套調(diào)用:輸入4個整數(shù),輸出其中的最大值。
#include<stdio.h>intmax_4(intb0,intb1,intb2,intb3);
//函數(shù)聲明intmax(intx,inty);
//函數(shù)聲明intmain(void){inta0,a1,a2,a3;
printf("請輸入4個整數(shù):");scanf("%d%d%d%d",&a0,&a1,&a2,&a3);
printf("最大值=%d\n",max_4(a0,a1,a2,a3));}intmax_4(intb0,intb1,intb2,intb3){
intm;
m=max(b0,b1);
m=max(m,b2);
m=max(m,b3);
return(m);}intmax(intx,inty){
return(x>y?x:y);}思考與練習(xí):
輸出其中的最小值。4.3函數(shù)的調(diào)用4.3.3函數(shù)的遞歸調(diào)用
在調(diào)用一個函數(shù)的過程中,又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。直接遞歸調(diào)用間接遞歸調(diào)用4.3函數(shù)的調(diào)用4.3.3函數(shù)的遞歸調(diào)用【例4.5】有5個人坐在一起,問第5個人多少歲,他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第3個人,又說比第2個人大2歲。問第2個人,說比第1個人大2歲。最后問第1個人,他說他10歲。請問第5個人多大?顯然,這是一個遞歸問題,分回推和遞推兩個過程:上述過程,可用數(shù)學(xué)公式表述:
程序中需要具有一個結(jié)束遞歸過程的條件。age(1)=10,就是使遞歸結(jié)束的條件。#include<stdio.h>intage(intn)
//求年齡的遞歸函數(shù),函數(shù)參數(shù):變量n{
intc;if(n==1)c=10;elsec=age(n-1)+2;//函數(shù)遞歸調(diào)用return(c);}intmain(void){ printf("第5個人的年齡:%d\n",
age(5));//調(diào)用age函數(shù)
}4.3函數(shù)的調(diào)用4.3.3函數(shù)的遞歸調(diào)用練習(xí):求1!+2!+3!+…+n!的值(其中n的值由鍵盤輸入)?!纠?.6】用遞歸方法計算n的階乘n!公式表示:#include<stdio.h>#include<stdlib.h>longlong
jc(intn)//求階乘的遞歸函數(shù){
longlongx;if(n<0){ printf("n<0,輸入錯誤!\n");
exit(0);
//終止程序運(yùn)行}else{ if(n==0||n==1)x=1;else
x=jc(n-1)*n;//函數(shù)遞歸調(diào)用return(x); }}intmain(void){intn;
longlongy;printf("請輸入一個正整數(shù):");scanf("%d",&n);y=jc(n);printf("%d!=%I64d\n",
n,
y);}用于輸出長長整型數(shù)據(jù)4.4數(shù)組作為函數(shù)參數(shù)
4.4.1數(shù)組元素作為函數(shù)實(shí)參
在函數(shù)調(diào)用時,將實(shí)參(數(shù)組元素,相當(dāng)于普通變量)的值傳遞給形參(變量),實(shí)現(xiàn)“單向的值傳遞”。
數(shù)組用作函數(shù)參數(shù)有兩種形式:數(shù)組元素作為函數(shù)的實(shí)參;數(shù)組名作為函數(shù)的實(shí)參和形參。【例4.7】數(shù)組元素作為函數(shù)實(shí)參:根據(jù)學(xué)生課程成績,判斷考試結(jié)果。#include<stdio.h>voidtest(intx);
//函數(shù)聲明intmain(void){inta[5]={62,57,70,48,85},i;//將課程成績存入數(shù)組a中for(i=0;i<5;i++){printf("a[%d]=%d:",i,a[i]);test(a[i]);
//調(diào)用成績測試函數(shù),數(shù)組元素a[i]作為實(shí)參
}}voidtest(intx)
//成績測試函數(shù),函數(shù)參數(shù):變量x{if(x>=60)printf("Pass!\n");
//通過else
printf("Fail!\n");
//不及格
}4.4數(shù)組作為函數(shù)參數(shù)
4.4.2數(shù)組名作為函數(shù)參數(shù)
數(shù)組名作為函數(shù)參數(shù)時,實(shí)參向形參傳遞的信息是數(shù)組的首地址,即“單向的地址傳遞”。
數(shù)組名作為函數(shù)的實(shí)參和形參時,應(yīng)在主調(diào)函數(shù)和被調(diào)函數(shù)中分別定義實(shí)參數(shù)組和形參數(shù)組,并且類型要一致,其中形參數(shù)組在定義時可以不指定大小。【例4.8】數(shù)組名作為函數(shù)的實(shí)參和形參。
函數(shù)調(diào)用時,是將實(shí)參數(shù)組a的首地址傳遞給形參數(shù)組名b,使形參數(shù)組名獲得了實(shí)參數(shù)組的首地址,因此形參數(shù)組與實(shí)參數(shù)組為同一數(shù)組。
顯然,a[i]與b[i]共占同一存儲單元,因此當(dāng)形參數(shù)組各元素的值發(fā)生變化時,實(shí)參數(shù)組元素的值也隨之變化。#include<stdio.h>voidchange(intb[],intn);
//函數(shù)聲明intmain(void){ inta[5]={1,3,5,7,9},i;printf("函數(shù)調(diào)用前:");for(i=0;i<5;i++)printf("a[%d]=%d",i,a[i]);printf("\n");
change(a,
5);//調(diào)用change函數(shù),實(shí)參:數(shù)組名a、數(shù)值5printf("函數(shù)調(diào)用后:");for(i=0;i<5;i++)printf("a[%d]=%d",i,a[i]);printf("\n");}voidchange(intb[],intn)//形參:數(shù)組名b、變量n{ inti;for(i=0;i<n;i++)
b[i]++;}
可見,在函數(shù)調(diào)用之后,實(shí)參數(shù)組a元素的值發(fā)生了變化。其奧秘何在?4.4數(shù)組作為函數(shù)參數(shù)
4.4.2數(shù)組名作為函數(shù)參數(shù)
數(shù)組名作函數(shù)參數(shù),在函數(shù)執(zhí)行過程中,當(dāng)形參數(shù)組各元素的值發(fā)生變化時,實(shí)參數(shù)組元素的值也隨之變化。在程序設(shè)計中,可以利用這一特點(diǎn)改變實(shí)參數(shù)組元素的值。【例4.10】數(shù)組名作為函數(shù)的參數(shù),編寫冒泡法排序程序(由小到大)。voidMPSort(intb[],intn)//冒泡排序函數(shù),形參:數(shù)組名b、變量n{ inti,j,t,swap_flag;for(i=1;i<n;i++)
//n個數(shù),共需比較n-1輪{swap_flag=0;
//交換標(biāo)志:0-無交換,1-有交換for(j=0;j<n-i;j++)//第i輪需要比較n-i次{if(b[j]>b[j+1])
//依次比較兩個相鄰的數(shù),將大數(shù)放后面{ t=b[j];b[j]=b[j+1];b[j+1]=t;swap_flag=1;//交換
}}if(swap_flag==0)break;//若本輪無交換,則結(jié)束比較}}#defineN5
//宏定義參與排序的數(shù)據(jù)個數(shù)voidMPSort(intb[],intn);
//函數(shù)聲明intmain(void){ inta[N],i;
//數(shù)組a存放待排序的N個數(shù)
...//依次輸入N個數(shù)據(jù)給數(shù)組a...//依次輸出數(shù)組a的各元素值(排序前)
MPSort(a,N);//調(diào)用排序函數(shù),實(shí)參:數(shù)組名a、數(shù)值N...//依次輸出數(shù)組a的各元素值(排序后)}4.4數(shù)組作為函數(shù)參數(shù)
4.4.2數(shù)組名作為函數(shù)參數(shù)練習(xí):以數(shù)組名作為函數(shù)參數(shù):
(1)編寫選擇法排序函數(shù)。
(2)例4.9:輸入若干個整數(shù),輸出其中的最大值和最小值。(3)例4.11:編寫字符串長度測試函數(shù)和字符串連接函數(shù)。
(4)例4.12:輸出3×4矩陣中值最大的那個元素值及其所在的行號和列號。(4)輸入兩個矩陣的數(shù)值,輸出這兩個矩陣的乘積。4.5變量的類型
4.5.1局部變量和全局變量
從變量值存在的時間(生存期)角度,變量有靜態(tài)存儲和動態(tài)存儲兩種存儲方式。從變量的作用域(作用范圍)角度,變量可分為局部變量和全局變量。1、局部變量
在函數(shù)或復(fù)合語句的內(nèi)部定義的變量是內(nèi)部變量,也稱為“局部變量”,只在本函數(shù)或復(fù)合語句范圍內(nèi)有效。函數(shù)的形參是局部變量。
主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其它函數(shù)中使用,并且主函數(shù)也不能使用其他函數(shù)中定義的變量。
允許在不同的函數(shù)中使用相同的局部變量名,它們代表不同的對象,分配不同的內(nèi)存單元,互不干擾,也不會發(fā)生混淆。4.5變量的類型
2、全局變量
在函數(shù)外部定義的變量是外部變量,也稱“全局變量”。全局變量的有效范圍是從定義變量的位置開始到本源文件結(jié)束。4.5.1局部變量和全局變量4.5變量的類型
(1)打通函數(shù)之間數(shù)據(jù)聯(lián)系的通道,使多個函數(shù)共享全局變量的值;并且通過函數(shù)調(diào)用可以得到一個以上的值。2、全局變量4.5.1局部變量和全局變量【例4.13】輸入正方體的棱長,輸出其表面積和體積的大小。#include<stdio.h>floatS,V;
//定義全局變量S和V,分別存放表面積和體積voidsv(floatx)//求正方體的表面積和體積函數(shù){
S=6*x*x;
//計算表面積
V=x*x*x;
//計算體積
}intmain(void){ floata;
//定義變量a,存放正方體的棱長printf("請輸入正方體的棱長:");scanf("%f",
&a);
sv(a);
//調(diào)用求表面積和體積函數(shù)printf("棱長=%6.2f,表面積=%6.2f,體積=%6.2f\n",
a,
S,
V);}4.5變量的類型
(2)在同一個源文件中,若全局變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量被“屏蔽”失效。2、全局變量4.5.1局部變量和全局變量【例4.14】外部變量與局部變量同名。
說明:盡管使用全局變量有時會帶來一些便利,但建議不是非常必要的情況下,盡量不要使用全局變量。為了實(shí)現(xiàn)程序的模塊化設(shè)計(函數(shù)化),提倡通過“實(shí)參-形參”的方式實(shí)現(xiàn)函數(shù)之間的信息傳遞,例如數(shù)組名作為函數(shù)參數(shù)。#include<stdio.h>inta=1,b=2;
//a、b為全局變量intadd(inta,intb)//a、b為局部變量{ intc;c=a+b;return(c);}intmain(void){
inta=3;
//a為局部變量printf("%d\n",
add(a,
b));}4.5變量的類型
(3)若定義全局變量時不賦初值,系統(tǒng)會自動賦初值數(shù)值0或空字符'\0'。2、全局變量4.5.1局部變量和全局變量【例4.15】考察全局變量和局部變量的系統(tǒng)默認(rèn)初值。若定義局部變量時不賦初值,則系統(tǒng)會為其賦一個隨機(jī)值。#include<stdio.h>inta;
//定義全局變量charb;
//定義全局變量intmain(void){
inti;
//定義局部變量
charj;
//定義局部變量printf("a=%d,b=%c,i=%d,j=%c\n",a,
b,
i,
j);}4.5變量的類型
4.5.2變量的存儲方式
從變量值存在的時間(生存期)角度,變量有靜態(tài)存儲和動態(tài)存儲兩種存儲方式(存儲類別)。變量有兩個屬性:存儲類型和數(shù)據(jù)類型。定義變量的完整格式:
存儲類別數(shù)據(jù)類型變量名;
動態(tài)存儲:在程序運(yùn)行期間根據(jù)需要(如調(diào)用函數(shù)時)臨時分配存儲空間。
靜態(tài)存儲:在程序運(yùn)行期間分配固定的存儲空間,即變量在程序整個運(yùn)行時間內(nèi)都存在。
全局變量使用靜態(tài)存儲,而局部變量使用靜態(tài)存儲或動態(tài)存儲。
有4個存儲類別標(biāo)識符:自動的(auto)、靜態(tài)的(static)、寄存器的(register)和外部的(extern)。
4.5變量的類型
1、局部變量的存儲類別聲明4.5.2變量的存儲方式(1)用auto聲明動態(tài)局部變量
程序中大多數(shù)局部變量以及函數(shù)的形參變量都是自動局部變量,關(guān)鍵字“auto”通常省略不寫。例如autointa,b;通常簡寫成:inta,b;
在調(diào)用該函數(shù)時,系統(tǒng)臨時為局部變量x、a、b分配存儲空間,在函數(shù)調(diào)用結(jié)束時系統(tǒng)自動釋放這些存儲空間。此類局部變量稱為自動局部變量,也稱為動態(tài)局部變量。intf(intx)
//定義f函數(shù),x為形參變量{
autointa,
b;//定義a、b為自動局部變量...}4.5變量的類型
4.5.2變量的存儲方式(2)用static聲明靜態(tài)局部變量1、局部變量的存儲類別聲明
有時希望函數(shù)中的局部變量在函數(shù)調(diào)用結(jié)束后,其占用的存儲單元不被釋放,其值不消失而繼續(xù)被保留。需要用static將該局部變量聲明為靜態(tài)存儲類型?!纠?.16】考察動態(tài)局部變量和靜態(tài)局部變量的值。
變量a、b在三次函數(shù)調(diào)用時的初值和函數(shù)調(diào)用結(jié)束時的值的變化情況:第幾次調(diào)用
函數(shù)調(diào)用時的初值函數(shù)調(diào)用結(jié)束時的值abab第1次22第2次23第3次24123111練習(xí):
【例4.17】考察靜態(tài)局部變量和靜態(tài)局部數(shù)組的系統(tǒng)默認(rèn)初值。#include<stdio.h>voidlv();
//函數(shù)聲明intmain(void){inti;for(i=1;i<=3;i++){ printf("第%d次調(diào)用lv函數(shù)后:",i);
lv();
//調(diào)用lv函數(shù)
}}voidlv()
//局部變量函數(shù){
autointa=1;//定義動態(tài)局部變量astaticintb=1;//定義靜態(tài)局部變量b
a++; b++;printf("a=%db=%d\n",
a,
b);}4.5變量的類型
4.5.2變量的存儲方式(2)用static聲明靜態(tài)局部變量1、局部變量的存儲類別聲明
說明:雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后其值仍被保留,但僅限本函數(shù)(或復(fù)合語句)使用,而其他函數(shù)不能引用它。4.5變量的類型
靜態(tài)局部變量的常用場合:需要保留上次函數(shù)調(diào)用結(jié)束時的值【例4.18】利用靜態(tài)局部變量實(shí)現(xiàn):輸出1到5的階乘。
計算(n+1)!,要用n!
的結(jié)果。因此計算n!后,要保留其結(jié)果,供計算(n+1)!時使用。問題分析:
1!=1 2!=2×1!3!=3×2!4!=4×3!5!=5×4?。╪+1)!=(n+1)×n!4.5.2變量的存儲方式(2)用static聲明靜態(tài)局部變量1、局部變量的存儲類別聲明#include<stdio.h>intjc(intn);
//函數(shù)聲明intmain(void){ inti;for(i=1;i<=5;i++)printf("%d!=%d\n",i,jc(i));}intjc(intn)//計算階乘函數(shù){
staticintf=1;
//定義靜態(tài)局部變量f,存放階乘結(jié)果f=f*n;return(f);}4.5變量的類型
靜態(tài)局部變量的常用場合:需要保留上次函數(shù)調(diào)用結(jié)束時的值【例4.19】嵌入式應(yīng)用:定時時間到(如每隔100ms),CPU執(zhí)行一次fun函數(shù)。在fun函數(shù)中,利用靜態(tài)局部變量進(jìn)行定時計數(shù),計數(shù)達(dá)到預(yù)定值時(如每隔500ms)將執(zhí)行一次對應(yīng)的功能程序。4.5.2變量的存儲方式(2)用static聲明靜態(tài)局部變量1、局部變量的存儲類別聲明4.5變量的類型
(3)用register聲明寄存器變量1、局部變量的存儲類別聲明4.5.2變量的存儲方式【例4.20】使用寄存器變量,輸出1+2+3+…+1000的值。
說明:
1)只有動態(tài)局部變量才可定義為寄存器變量,而全局變量和靜態(tài)局部變量都不能定義為寄存器變量。2)寄存器變量只能用于整型變量和字符型變量。3)很多編譯系統(tǒng)會自動將讀寫頻繁的內(nèi)存變量優(yōu)化為CPU寄存器變量(不需要程序設(shè)計者指定),以提高程序執(zhí)行效率。若不希望被優(yōu)化為寄存器變量時,需在
定義內(nèi)存變量時使用關(guān)鍵字“volatile”進(jìn)行限定,如:volatileinti;
當(dāng)一個內(nèi)存變量被頻繁讀寫時,需要反復(fù)訪問內(nèi)存,花費(fèi)大量的存取時間。為此,可用register將變量聲明為“寄存器變量”,直接從CPU的寄存器中對變量進(jìn)行讀寫,以提高程序執(zhí)行效率。#include<stdio.h>intmain(void){
registerlongi,s=0;//定義寄存器變量i、sumfor(i=1;i<=100
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 風(fēng)力發(fā)電基礎(chǔ)施工合同范本
- 軟件授權(quán)使用合同范本
- 廈門市中心房屋租賃合同范本
- 別墅外裝合同范例
- 2025年度市政基礎(chǔ)設(shè)施工程擔(dān)保合同模板
- 公司錄用員工合同范本
- 農(nóng)民世界游戲托管合同范本
- 公司做監(jiān)控合同范本
- 義烏買賣合同范本
- 2025年度藝術(shù)品交易居間服務(wù)合同范本(2025年度版)
- 校園安全派出所
- 餐廳值班管理培訓(xùn)
- (正式版)JBT 11517-2024 刮板取料機(jī)
- XXXX無線維護(hù)崗位認(rèn)證教材故障處理思路及案例分析
- 2024年浙江省自然資源集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 酒店春節(jié)營銷方案
- 營銷管理方案中的定價策略與盈利模式
- 2024年西寧城市職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 2024年臨沂市高三一模(學(xué)業(yè)水平等級考試模擬試題)物理試卷
- 我國糖尿病視網(wǎng)膜病變臨床診療指南2022解讀
- 高級茶藝師技能鑒定(協(xié)會版)備考題庫-下(多選、判斷題匯總)
評論
0/150
提交評論