版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語言程序設(shè)計(jì)吉林大學(xué)珠海學(xué)院計(jì)算機(jī)系第5章函數(shù)函數(shù)的基本結(jié)構(gòu)函數(shù)的調(diào)用函數(shù)的參數(shù)傳遞變量的作用域及存儲(chǔ)類型4123本章內(nèi)容函數(shù)的基本概念所謂函數(shù),是可以反復(fù)使用的一個(gè)程序段,其他函數(shù)可通過調(diào)用語句來執(zhí)行這段程序,完成所需要的工作程序由基本語句和函數(shù)組成,每個(gè)函數(shù)完成相對(duì)獨(dú)立的功能,按一定規(guī)則調(diào)用這些函數(shù),就組成了解決某個(gè)特定問題的程序函數(shù)的基本概念從用戶的角度看,函數(shù)有兩種:1.標(biāo)準(zhǔn)庫函數(shù),由系統(tǒng)提供的。2.用戶自定義函數(shù),由程序設(shè)計(jì)者根據(jù)專門需要自己定義的從函數(shù)的定義形式看,函數(shù)分兩類:1.無參函數(shù),在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞參數(shù)。2.有參函數(shù),在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)和被調(diào)用函數(shù)之間有參數(shù)函數(shù)定義函數(shù)定義的一般格式函數(shù)類型函數(shù)名(形式參數(shù)形式參數(shù)列表
){函數(shù)體}函數(shù)類型:函數(shù)執(zhí)行后返回結(jié)果的數(shù)據(jù)類型。若函數(shù)不返回任何結(jié)果值,那么函數(shù)類型指定為void。若函數(shù)類型省略,將默認(rèn)是int函數(shù)定義理解如下定義的函數(shù)longcube(intx){longa;a=x*x*x;return(a);}函數(shù)定義函數(shù)名稱:cube執(zhí)行后返回值類型是long型形式參數(shù):int型,名稱為x變量聲明:在函數(shù)體里,說明一個(gè)long型變量a,執(zhí)行語句:a=x*x*x;
返回語句:return(a);將a的值返回調(diào)用者函數(shù)類型long與return語句的返回值應(yīng)一致該函數(shù)不能獨(dú)立運(yùn)行,必須由調(diào)用者通過調(diào)用語句,把要計(jì)算的對(duì)象傳遞給它函數(shù)定義定義函數(shù)功能:若接收整型參數(shù)是偶數(shù),則打印Itiseven!,否則打印Itisodd!
void
odd_even(intx){if(x%2==0)
printf("Itiseven!\n");elseprintf("Itisodd!\n");}函數(shù)調(diào)用函數(shù)被定義后,只有在調(diào)用函數(shù)里安排函數(shù)調(diào)用,才能將控制從調(diào)用者轉(zhuǎn)移到被調(diào)函數(shù),也才能進(jìn)行數(shù)據(jù)的傳遞調(diào)用者在函數(shù)調(diào)用時(shí),可向被調(diào)用者傳遞一個(gè)或多個(gè)參數(shù)。由調(diào)用者傳遞給被調(diào)函數(shù)的參數(shù),稱為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參。被調(diào)函數(shù)接收傳遞過來的實(shí)參后,依據(jù)這些數(shù)據(jù)執(zhí)行函數(shù)體里的語句。執(zhí)行結(jié)束后,就把控制返回到調(diào)用者發(fā)出函數(shù)調(diào)用的地方,繼續(xù)其執(zhí)行函數(shù)調(diào)用有返回值的函數(shù),是以函數(shù)表達(dá)式的方式調(diào)用函數(shù)名(實(shí)際參數(shù)表)無返回值的函數(shù),是以函數(shù)調(diào)用語句得方式調(diào)用函數(shù)名(實(shí)際參數(shù)表);無論是有返回值還是沒有返回值,函數(shù)調(diào)用時(shí)在實(shí)際參數(shù)表中列出的實(shí)參,必須與被調(diào)函數(shù)在定義時(shí)在形式參數(shù)表中所列形參的個(gè)數(shù)相等、類型相符、次序相同,各實(shí)參之間仍以逗號(hào)為分隔符函數(shù)調(diào)用函數(shù)返回值是通過return語句帶回到主調(diào)函數(shù)return(表達(dá)式);或return表達(dá)式;函數(shù)返回值類型由函數(shù)類型決定被調(diào)函數(shù)無return語句,返回值不確定函數(shù)定義為void類型,不帶回返回值函數(shù)可有多條return語句,但是一次運(yùn)行,只能執(zhí)行其中一條return語句。通過return語句只能返回一個(gè)值;如要返回多個(gè)值,只有借助于指針或數(shù)組函數(shù)調(diào)用例5.1:調(diào)用cube(intx)函數(shù)#include<stdio.h>longcube(intx){longa;a=x*x*x;return(a);}voidmain(){
inta;longm;
scanf("%d",&a);m=cube(a);
printf(“Thecudeof%dis%ld\n",a,m);
printf(“Thecudeof%dis%ld\n",a,cube(a));}函數(shù)調(diào)用例5.2:調(diào)用odd_even(intx)函數(shù)#include<stdio.h>voidodd_even(intx){if(x%2==0)
printf("Itiseven!\n");elseprintf("Itisodd!\n");}voidmain(){
inta;
scanf("%d",&a);
odd_even(a);}函數(shù)調(diào)用例5.3:定義名為power的函數(shù),計(jì)算x的n次方#include<stdio.h>doublepower(doublex,intn){doubles;for(s=1.0;n>0;n--){s=s*x;}return(s);}main(){doublea,pow;
inti;
scanf("%lf%d",&a,&i);
pow=power(a,i);
printf("value=%lf\n",pow);}函數(shù)調(diào)用例5.4:編寫判斷素?cái)?shù)的函數(shù),求出100以內(nèi)素?cái)?shù)所謂素?cái)?shù)是指只能被1和自己整除的自然數(shù)除2以外,素?cái)?shù)都是奇數(shù)定義函數(shù)prime(intn),接收調(diào)用者傳遞的參數(shù)剔除n=1的情況,單獨(dú)處理n=2的情況其余用循環(huán)來判斷:剔除偶數(shù),尋找從3到sqrt(n)之間的奇數(shù)是否存在能整除n的數(shù)。若有,則表明n不是素?cái)?shù),返回值0;否則n為素?cái)?shù),返回值1
函數(shù)調(diào)用例5.4:編寫判斷素?cái)?shù)的函數(shù),求出100以內(nèi)素?cái)?shù)#include<stdio.h>#include<math.h>intprime(intn){
inti;if(n==1)return0;elseif(n==2)return1;elseif(n%2==0)return0;else{for(i=3;i<=sqrt(n);i+=2)if(n%i==0)return0;}return1;}main(){
intk,x;for(x=1;x<=100;x++){k=prime(x);if(k==1)printf("%d\n",x);}}函數(shù)調(diào)用形式參數(shù):在定義函數(shù)時(shí)函數(shù)名后面括弧中的變量名,簡(jiǎn)稱形參實(shí)際參數(shù):在調(diào)用函數(shù)時(shí)函數(shù)名后面括弧中的表達(dá)式,簡(jiǎn)稱實(shí)參函數(shù)調(diào)用在函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單元,當(dāng)調(diào)用結(jié)束時(shí),形參所占內(nèi)存被釋放實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定的值實(shí)參與形參類型相同或賦值兼容,字符型與整型可以兼容實(shí)參與形參個(gè)數(shù)必須相等。在函數(shù)調(diào)用時(shí),實(shí)參的值賦給與之相對(duì)應(yīng)的形參,單向值傳遞函數(shù)調(diào)用例5.5:定義名為swap的函數(shù),交換兩個(gè)形參#include<stdio.h>voidswap(intx,inty){
inttemp;temp=x;x=y;y=temp;
printf("x=%d,y=%d\n",x,y);}main(){
inta=10,b=20;
swap(a,b);
printf("a=%d,b=%d\n",a,b);}函數(shù)調(diào)用10a20b①調(diào)用前10a20b②
調(diào)用10x20y③
swap10a20b10x20ytemp10201010a20b④
調(diào)用結(jié)束函數(shù)調(diào)用例5.6:理解實(shí)參為普通變量時(shí)傳遞數(shù)據(jù)的過程當(dāng)以普通變量作為參數(shù)進(jìn)行數(shù)據(jù)傳遞時(shí),調(diào)用者是把實(shí)參的值賦給被調(diào)用者的形參實(shí)參和形參占用的是內(nèi)存中不同的存儲(chǔ)區(qū),被調(diào)函數(shù)對(duì)形參的加工,是在形參自己的存儲(chǔ)區(qū)里進(jìn)行的,所以不會(huì)去改變和影響到實(shí)參被調(diào)用者要返回信息給調(diào)用者,只能通過return語句,不能借助于形參或?qū)崊?。所以稱這種數(shù)據(jù)傳遞是單向值傳遞函數(shù)調(diào)用例5.6:理解實(shí)參為普通變量時(shí)傳遞數(shù)據(jù)的過程#include<stdio.h>intadd(intx,inty){
intz;
printf("&x=%p&y=%p\n",&x,&y);
printf("x=%dy=%d\n",x,y);x=x+10;y=y+15;z=x+y;
printf("x=%dy=%d\n",x,y);return(z);}main(){
inta,b,c;
printf("Pleaseentertwointegers:");
scanf("%d%d",&a,&b);
printf("&a=%p&b=%p\n",&a,&b);
printf("a=%db=%d\n",a,b);c=add(a,b);
printf("a=%db=%d\n",a,b);
printf("c=%d\n",c);}函數(shù)調(diào)用例5.7:理解實(shí)參為數(shù)組名時(shí)傳遞數(shù)據(jù)的過程用數(shù)組名作為函數(shù)參數(shù)時(shí),應(yīng)該在調(diào)用函數(shù)和被調(diào)用函數(shù)中分別定義數(shù)組形參數(shù)組與實(shí)參數(shù)組共享同一個(gè)存儲(chǔ)區(qū)雙向傳遞,對(duì)形參數(shù)組所做的操作可能會(huì)影響到實(shí)參數(shù)組元素的值形參數(shù)組和實(shí)參數(shù)組的長(zhǎng)度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而不檢查形參數(shù)組的長(zhǎng)度函數(shù)調(diào)用例5.7:理解實(shí)參為數(shù)組名時(shí)傳遞數(shù)據(jù)的過程#include<stdio.h>intadd(intx[10]){
intk,temp=0;
printf("x=%p
&x[4]=%p\n",x,&x[4]);for(k=0;k<10;k++){temp+=x[k];
x[k]+=10;
printf("x[%d]=%d",k,x[k]);}
printf("Thetemp=%d\n",temp);returntemp;}main(){
inta[10]={1,2,3,4,5,6,7,8,9,10},sum,i;
printf("a=%p&a[4]=%p\n",a,&a[4]);sum=add(a);for(i=0;i<10;i++)printf("a[%d]=%d",i,a[i]);
printf("Thesum=%d\n",sum);}函數(shù)原型說明調(diào)用一個(gè)用戶函數(shù)時(shí),必須先保證被調(diào)用的用戶函數(shù)已經(jīng)存在。所以在上面所舉的每個(gè)例子里,都是把被調(diào)函數(shù)放在了調(diào)用者的前面若調(diào)用和被調(diào)用函數(shù)的位置顛倒了,當(dāng)被調(diào)函數(shù)返回值類型是int、char時(shí),不會(huì)有什么關(guān)系;若被調(diào)函數(shù)返回值的類型是float、double或void等,那么編譯時(shí)就會(huì)給出出錯(cuò)信息函數(shù)原型說明C語言有兩種解決的辦法:一是把被調(diào)用者與調(diào)用者的位置重新放正確二是保持這種顛倒的位置關(guān)系,但在整個(gè)程序最前面或在調(diào)用函數(shù)里先對(duì)被調(diào)函數(shù)做一個(gè)說明,這就是所謂的函數(shù)原型說明函數(shù)原型說明函數(shù)原型說明的一般格式是函數(shù)類型函數(shù)名(形參類型表);函數(shù)原型說明與函數(shù)定義有兩點(diǎn)區(qū)別:一是函數(shù)定義中給出的是形式參數(shù)表,由<類型><參數(shù)>對(duì)組成,函數(shù)原型說明里給出的是形參類型表,它只列出<類型>二是函數(shù)原型說明要以分號(hào)為結(jié)尾,是一條說明語句函數(shù)原型說明如果已在所有函數(shù)定義之前,在文件的開頭,在函數(shù)的外部已說明了函數(shù)類型,則在各個(gè)主調(diào)函數(shù)中不必對(duì)所調(diào)用的函數(shù)再做說明函數(shù)的返回值為整型或字符型時(shí),可以不進(jìn)行類型說明,系統(tǒng)按整型處理被調(diào)用函數(shù)定義在主調(diào)函數(shù)之前,可以不進(jìn)行類型說明函數(shù)原型說明例5.8:將任意兩個(gè)字符串連接成一個(gè)字符串
str1str2str3'H''e''l''l''o''''\0''c''h''i''n''a''!''\0's1s2s3調(diào)用前調(diào)用連接'H''e''l''l''o'''for(i=0;s1[i]!='\0';i++)s3[i]=s1[i];'c''h''i''n''a''!'for(j=0;s2[j]!='\0';j++)s3[i+j]=s2[j];'\0'補(bǔ)\0s3[i+j]='\0';調(diào)用結(jié)束函數(shù)原型說明例5.8:將任意兩個(gè)字符串連接成一個(gè)字符串#include<stdio.h>voidmergestr(chars1[],chars2[],chars3[]);
voidmain(){charstr1[]={"Hello"},str2[]={"china!"};charstr3[40];
mergestr(str1,str2,str3);
printf("%s\n",str3);}voidmergestr(chars1[],chars2[],chars3[]){
inti,j;for(i=0;s1[i]!='\0';i++)//將s1復(fù)制到s3中
{s3[i]=s1[i];}for(j=0;s2[j]!='\0';j++)//將s2復(fù)制到s3的后邊
{s3[i+j]=s2[j];}s3[i+j]='\0';//置字符串結(jié)束標(biāo)志}函數(shù)原型說明例5.9:用冒泡法將10個(gè)整數(shù)按照從小到大排序#include<stdio.h>voidsort(intb[],intn);voidprintarr(intb[],intn);
main(){
inta[10]={11,22,63,97,58,80,45,32,73,36};
printf("Beforesort:\n");printarr(a,10);
sort(a,10);
printf("Aftersort:\n");
printarr(a,10);}函數(shù)原型說明例5.9:用冒泡法將10個(gè)整數(shù)排序voidprintarr(intb[10],intn){
inti;for(i=0;i<n;i++)printf("%5d",b[i]);
printf("\n");}voidsort(intb[],intn){
inti,j,temp,flag;for(i=1;i<n;i++){flag=0;for(j=0;j<n-i;j++)if(b[j]>b[j+1]){temp=b[j];b[j]=b[j+1];b[j+1]=temp;flag=1;}if(flag==0)break;}}函數(shù)原型說明a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11226397588045327336(a)排序前a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11223236455863738097(b)排序后4000b形參b實(shí)際是一個(gè)可以存放地址的變量a:4000實(shí)參賦給形參首地址:
2000首地址:4000main函數(shù){……調(diào)用函數(shù)A;
……}函數(shù)的嵌套調(diào)用嵌套的執(zhí)行過程函數(shù)B{
……
……
……}②①③④⑤⑦⑥⑧⑨函數(shù)A{……
調(diào)用函數(shù)B;
……}函數(shù)的嵌套調(diào)用例5.10:求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值#include<stdio.h>int
dif(intx,inty,intz);int
max(intx,inty,intz);int
min(intx,inty,intz);voidmain(){
inta,b,c,d;
scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);
printf(“max-min=%d\n",d);}int
dif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}函數(shù)的嵌套調(diào)用例5.10:求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值int
max(intx,inty,intz){
intr;r=(x>y)?x:y;
return((r>z)?r:z);}int
min(intx,inty,intz){
intr;r=(x<y)?x:y;
return((r<z)?r:z);}函數(shù)的遞歸調(diào)用函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()int
f(intx){
inty,z;……
z=f(y);…….return(2*z);}int
f1(intx){
inty,z;……
z=f2(y);…….return(2*z);}int
f2(intt){
inta,c;……
c=f1(a);…….return(3+c);}直接遞歸間接遞歸函數(shù)的遞歸調(diào)用例5.11:求n!以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1遞歸公式:n!=1當(dāng)n=1時(shí)n!=n*(n-1)! 當(dāng)n>1時(shí)遞歸結(jié)束條件:當(dāng)n=1或n=0時(shí),n!=1函數(shù)的遞歸調(diào)用例5.10:求n!#include<stdio.h>floatfac(intn){floatf=0;
if(n<0)printf("n<0,error!");elseif((n==0)||(n==1))f=1;elsef=n*fac(n-1);returnf;}main(){
intn;floaty;
scanf("%d",&n);
y=fac(n);
printf("%d!=%-10.0f\n",n,y);}函數(shù)的遞歸調(diào)用例5.12:漢諾塔:有A,B,C三個(gè)塔座,A上套有n個(gè)直徑不同的圓盤,按直徑從小到大疊放,形如寶塔,編號(hào)1,2,3……n。要求將n個(gè)圓盤從A移到C,疊放順序不變,移動(dòng)中遵循下列原則:每次只能移一個(gè)圓盤圓盤可在三個(gè)塔座上任意移動(dòng)任何時(shí)刻,每個(gè)塔座上不能將大盤壓到小盤上ABC函數(shù)的遞歸調(diào)用分析3個(gè)盤子的情況:1.將A座上2個(gè)盤子移到B座(借助C)2.將A座上1個(gè)盤子移到C座3.將B座上2個(gè)盤子移到C座(借助A)其中第2步可以直接實(shí)現(xiàn)第1、3步還需要遞歸分解A B CA B CA B C函數(shù)的遞歸調(diào)用遞歸分解:第1步——將A座上2個(gè)盤子移到B座(借助C),分解為:1.1將A上一個(gè)盤子從A移到C;1.2將A上一個(gè)盤子從A移到B;1.3將C上一個(gè)盤子從C移到B。A B C1.1A B C1.2A B C1.3函數(shù)的遞歸調(diào)用遞歸分解:第3步——將B座上2個(gè)盤子移到C座(借助A),分解為:3.1將B上一個(gè)盤子從B移到A3.2將B上一個(gè)盤子從B移到C3.3將A上一個(gè)盤子從A移到CA B C3函數(shù)的遞歸調(diào)用將以上綜合起來,可得到移動(dòng)3個(gè)盤子的步驟為:A→C,A→B,C→BA→CB→A,B→C,A→C共經(jīng)歷7(=23-1)步??梢酝浦苿?dòng)n個(gè)盤子需要經(jīng)歷2n
-1。函數(shù)的遞歸調(diào)用解決方法:n=1時(shí),直接把圓盤從A移到Cn>1時(shí),先把上面n-1個(gè)圓盤從A移到B,然后將n號(hào)盤從A移到C,再將n-1個(gè)盤從B移到C。即把求解n個(gè)圓盤的Hanoi問題轉(zhuǎn)化為求解n-1個(gè)圓盤的Hanoi問題,依次類推,直至轉(zhuǎn)化成只有一個(gè)圓盤的Hanoi問題函數(shù)的遞歸調(diào)用函數(shù)move完成將第k個(gè)盤子從A移動(dòng)到Cmove(intno,charfrom,charto);no:盤子編號(hào),from:源柱to:目的柱函數(shù)hanoi完成將n個(gè)盤子從A移動(dòng)到Chanoi(intn,charone,chartwo,charthree)借助two將n個(gè)盤子從one移動(dòng)到three函數(shù)的遞歸調(diào)用將n個(gè)盤子借助B從A移動(dòng)到C,實(shí)現(xiàn)過程如下:函數(shù)調(diào)用’A’→one,’B’
→
two,’C’
→
three步驟1:hanoi(n-1,one,two,three);借助C柱子將n-1個(gè)盤子從A移到B步驟2:move(n,one,three);將第n個(gè)盤子從A柱子移動(dòng)到C柱子步驟3:hanoi(n-1,two,one,three);借助A柱子將n-1個(gè)盤子從B移到C函數(shù)的遞歸調(diào)用例5.12:漢諾塔:有A,B,C三個(gè)塔座,A上套有n個(gè)直徑不同的圓盤,按直徑從小到大疊放,形如寶塔,編號(hào)1,2,3……n。要求將n個(gè)圓盤從A移到C,疊放順序不變,移動(dòng)中遵循下列原則:每次只能移一個(gè)圓盤圓盤可在三個(gè)塔座上任意移動(dòng)任何時(shí)刻,每個(gè)塔座上不能將大盤壓到小盤上#include<stdio.h>voidmove(intno,charfrom,charto){printf("Move%3d:%c-->%c\n",no,from,to);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(n,one,three);else{hanoi(n-1,one,three,two);
move(n,one,three);hanoi(n-1,two,one,three);}}voidmain(){
intn;
printf("Inputthenumberofdiskes:");
scanf("%d",&n);
printf("Thesteptomoving%3ddiskes:\n",n);
hanoi(n,'A','B','C');}變量的作用域與生存期變量的作用域指變量在某區(qū)域內(nèi)有效分為局部變量與全局變量變量的生存期指變量在某一時(shí)刻存在分為靜態(tài)變量與動(dòng)態(tài)變量變量的作用域與生存期在所有函數(shù)之外定義的變量稱全局變量,它可被程序中的所有函數(shù)使用,其有效范圍為:從定義變量的位置開始到本源文件的結(jié)束在函數(shù)或復(fù)合語句里面定義的變量稱局部變量,它只能在說明它的范圍內(nèi)使用。即凡在一對(duì)花括號(hào)內(nèi)說明的變量,就是局部變量,它只能在該括號(hào)內(nèi)使用。出了這個(gè)括號(hào),該變量就不能使用了作為函數(shù)的形參。這類變量也是局部變量,其作用就是用于接收調(diào)用者傳遞過來的實(shí)參數(shù)據(jù)。越出了函數(shù)范圍,該變量就不能使用了變量的作用域與生存期在C語言中,稱一個(gè)變量的作用范圍為變量的作用域。由于每個(gè)變量都有自己的作用域,因此在不同函數(shù)內(nèi)說明的局部變量可使用相同的變量名,類型也可以不一樣,它們不會(huì)因?yàn)槊窒嗤ハ喔蓴_C語言規(guī)定,在一個(gè)源程序文件中,當(dāng)所說明的全局變量與某個(gè)函數(shù)內(nèi)說明的局部變量同名時(shí),那么在該局部變量的作用域,全局變量不起作用變量的作用域與生存期例5.13:變量的作用域#include<stdio.h>sub(){
inta=5,b=6;
printf("sub:a=%d,b=%d\n",a,b);}main(){
inta=3,b=4;
printf("main:a=%d,b=%d\n",a,b);sub();
printf("main:a=%d,b=%d\n",a,b);}變量的作用域與生存期變量的存儲(chǔ)類型指數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式,即編譯器為變量分配內(nèi)存的方式,它決定變量的生存期動(dòng)態(tài)存儲(chǔ)方式根據(jù)需要臨時(shí)分配存儲(chǔ)空間,離開即釋放靜態(tài)存儲(chǔ)方式在程序運(yùn)行期間分配固定的存儲(chǔ)空間不釋放變量的作用域與生存期程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)操作系統(tǒng)等系統(tǒng)區(qū)用戶區(qū)用來存放C語言程序運(yùn)行代碼用來存放變量,在這個(gè)區(qū)域中存儲(chǔ)的變量被稱作靜態(tài)變量。在程序開始執(zhí)行時(shí)全局變量全部放在靜態(tài)存儲(chǔ)區(qū)中,程序執(zhí)行完畢就釋放。在程序執(zhí)行過程中它們占據(jù)固定的存儲(chǔ)單元,而不是動(dòng)態(tài)地進(jìn)行分配和釋放用來存放變量以及進(jìn)行函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)信息和函數(shù)返回地址等,在這個(gè)區(qū)域存儲(chǔ)的變量稱之為動(dòng)態(tài)變量,如形參變量、函數(shù)體內(nèi)部定義的動(dòng)態(tài)局部變量。對(duì)于存放于動(dòng)態(tài)存儲(chǔ)區(qū)的變量,是在函數(shù)調(diào)用開始時(shí)才分配動(dòng)態(tài)存儲(chǔ)空間,函數(shù)運(yùn)行結(jié)束時(shí)釋放這些空間變量的作用域與生存期變量四種存儲(chǔ)類別externregisterautostatic變量的作用域與生存期自動(dòng)變量(auto)進(jìn)入語句塊時(shí)自動(dòng)申請(qǐng)內(nèi)存,退出時(shí)自動(dòng)釋放內(nèi)存標(biāo)準(zhǔn)定義格式
:auto類型名變量名;動(dòng)態(tài)局部變量缺省的存儲(chǔ)類型不初始化時(shí),值是不確定的變量的作用域與生存期靜態(tài)變量(static)在變量類型前面用static修飾:staticinti;在定義時(shí)未賦初值,則系統(tǒng)自動(dòng)賦初值0賦初值只一次,變量的值可以保存到下次進(jìn)入函數(shù),使函數(shù)具有記憶功能變量的作用域與生存期例5.14:靜態(tài)變量值具有可繼承性#include<stdio.h>voidFunc(void){staticinttimes=1;printf("times=%d\n",times++);}main(){
inti;for(i=0;i<10;i++){Func();}}變量的作用域與生存期寄存器變量(register)使用頻率比較高的變量聲明為register,可以使程序更小、執(zhí)行速度更快register類型名變量名;現(xiàn)代編譯器有能力自動(dòng)把普通變量
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 治療計(jì)劃的設(shè)計(jì)與實(shí)施過程
- 艾滋病培訓(xùn)課程
- 乳房再造課件教學(xué)課件
- 幼兒園成長(zhǎng)檔案
- 狂犬病健康教案
- 氟哌啶醇藥物治療護(hù)理
- 脫稿蝴蝶課件教學(xué)課件
- 3.1.1 鹽類的水解 課件 高二上學(xué)期化學(xué)人教版(2019)選擇性必修1
- 醫(yī)院感染流行病學(xué)
- 致心律失常型右室心肌病
- 《白描人物摹神韻》 課件 2024-2025學(xué)年嶺南美版(2024) 初中美術(shù)七年級(jí)上冊(cè)
- 2024年浙江省寧波市鄞州中學(xué)強(qiáng)基招生數(shù)學(xué)試題
- 2024年全國職業(yè)院校技能大賽高職組(藥學(xué)技能賽項(xiàng))考試題庫(含答案)
- 2024至2030年中國羽毛球行業(yè)發(fā)展現(xiàn)狀及投資趨勢(shì)研究報(bào)告
- 儲(chǔ)能電池?zé)崾Э鼗馂?zāi)演化機(jī)制及防控
- 2024年公司市場(chǎng)化選聘經(jīng)理層考核管理辦法
- 太陽能光伏電站施工安全標(biāo)準(zhǔn)化建設(shè)考核試卷
- 防炫(AG工藝)玻璃項(xiàng)目可行性研究報(bào)告模板-備案拿地
- 煤炭洗選工藝數(shù)字化與智能化
- 2024年【汽車駕駛員(技師)】證模擬考試及答案
- 大學(xué)生心理健康教育智慧樹知到期末考試答案章節(jié)答案2024年魯東大學(xué)
評(píng)論
0/150
提交評(píng)論