




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
#include<stdio.h>voidmain(){float
average(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);}#include<stdio.h>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
floataverage(floatarray[10例8.12形參數(shù)組不定義長(zhǎng)度#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));
}例8.12形參數(shù)組不定義長(zhǎng)度#include<stdiofloataverage(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.20floataverage(floatarray[]例8.13用選擇法對(duì)數(shù)組中10個(gè)整數(shù)按由小到大排序。所謂選擇法就是先將10個(gè)數(shù)中最小的數(shù)與a[0]對(duì)換;再將a[1]到a[9]中最小的數(shù)與a[1]對(duì)換……每比較一輪,找出一個(gè)未經(jīng)排序的數(shù)中最小的一個(gè)。共比較9輪。例8.13用選擇法對(duì)數(shù)組中10個(gè)整數(shù)按由小到大排序。所謂a[0]a[1]a[2]a[3]a[4]36194未排序時(shí)的情況
16394
將5個(gè)數(shù)中最小的數(shù)1與a[0]對(duì)換
13694
將余下的4個(gè)數(shù)中最小的數(shù)3與a[1]對(duì)換
13496
將余下的3個(gè)數(shù)中最小的數(shù)4與a[2]對(duì)換
13469
將余下的2個(gè)數(shù)中最小的數(shù)6與a[3]對(duì)換,至此完成排序
a[0]a[1]a[2]a[3]a[4程序?qū)嵗?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″);
}
程序?qū)嵗齰oidsort(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;t=array[k];
array[k]=array[i];array[i]=t
}}voidsort(intarray[],intn)§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));}
§8.7.3.多維數(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é)果如下:Maxvalueis34max_value(intarray[][4])運(yùn)§8.8局部變量和全局變量§8.8.1局部變量在一個(gè)函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說(shuō)只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。這稱為“局部變量”?!?.8局部變量和全局變量§8.8.1局部變量在一個(gè)函數(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有效}
floatf1(inta)/*(1)主函數(shù)中定義的變量(m,n)也只在主函數(shù)中有效,而不因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。(2)不同函數(shù)中可以使用相同名字的變量,它們代表不同的對(duì)象,互不干擾。例如,上面在f1函數(shù)中定義了變量b和c,倘若在f2函數(shù)中也定義變量b和c,它們?cè)趦?nèi)存中占不同的單元,互不混淆。(3)形式參數(shù)也是局部變量。例如上面f1函數(shù)中的形參a,也只在f1函數(shù)中有效。其他函數(shù)可以調(diào)用f1函數(shù),但不能引用f1函數(shù)的形參a。(4)在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語(yǔ)句中定義變量,這些變量只在本復(fù)合語(yǔ)句中有效,這種復(fù)合語(yǔ)句也稱為“分程序”或“程序塊”。說(shuō)明(1)主函數(shù)中定義的變量(m,n)也只在主函數(shù)中有效,而不voidmain(){inta,b;…{intc;c=a+b;c在此范圍內(nèi)有效a,b在此范圍內(nèi)有效
…}…}
voidmain()§8.8.2全局變量在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量稱為外部變量,外部變量是全局變量(也稱全程變量)。全局變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。§8.8.2全局變量在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)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;…}
intp=1,q=5;/*例8.15有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生成績(jī),寫一個(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);
}例8.15有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生成績(jī),寫一個(gè)函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
floataverage(floatarray[],iC語(yǔ)言程序設(shè)計(jì)教學(xué)課件建議不在必要時(shí)不要使用全局變量,原因如下:①全局變量在程序的全部執(zhí)行過(guò)程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元。②使用全局變量過(guò)多,會(huì)降低程序的清晰性,人們往往難以清楚地判斷出每個(gè)瞬時(shí)各個(gè)外部變量的值。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量的值,程序容易出錯(cuò)。因此,要限制使用全局變量。建議不在必要時(shí)不要使用全局變量,原因如下:①全局變量在程③它使函數(shù)的通用性降低了,因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。如果將一個(gè)函數(shù)移到另一個(gè)文件中,還要將有關(guān)的外部變量及其值一起移過(guò)去。但若該外部變量與其他文件的變量同名時(shí),就會(huì)出現(xiàn)問題,降低了程序的可靠性和通用性。一般要求把C程序中的函數(shù)做成一個(gè)封閉體,除了可以通過(guò)“實(shí)參——形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。③它使函數(shù)的通用性降低了,因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外例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.16外部變量與局部變量同名#include<s§8.9變量的存儲(chǔ)類別
§8.9.1動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式
前面已介紹了從變量的作用域(即從空間)角度來(lái)分,可以分為全局變量和局部變量。那么從變量值存在的時(shí)間(即生存期)角度來(lái)分,又可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。
所謂靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間的方式。而動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。這個(gè)存儲(chǔ)空間可以分為三部分:程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)§8.9變量的存儲(chǔ)類別§8.9.1動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存在C語(yǔ)言中每一個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)類別。對(duì)數(shù)據(jù)類型,讀者已熟悉(如整型、字符型等)。存儲(chǔ)類別指的是數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式。存儲(chǔ)方式分為兩大類:靜態(tài)存儲(chǔ)類和動(dòng)態(tài)存儲(chǔ)類。具體包含四種:自動(dòng)的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)。根據(jù)變量的存儲(chǔ)類別,可以知道變量的作用域和生存期。
在C語(yǔ)言中每一個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)類§8.9.2auto變量函數(shù)中的局部變量,如不專門聲明為static存儲(chǔ)類別,都是動(dòng)態(tài)地分配存儲(chǔ)空間的,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語(yǔ)句中定義的變量),都屬此類,在調(diào)用該函數(shù)時(shí)系統(tǒng)會(huì)給它們分配存儲(chǔ)空間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)釋放這些存儲(chǔ)空間。因此這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字auto作存儲(chǔ)類別的聲明。例如:intf(inta)/*定義f函數(shù),a為形參*/{autointb,c=3;/*定義b、c為自動(dòng)變量*/
…
}§8.9.2auto變量函數(shù)中的局部變量,如不專門聲明為s8.9.3用static聲明局部變量
有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲(chǔ)單元不釋放,在下一次該函數(shù)調(diào)用時(shí),該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時(shí)的值。這時(shí)就應(yīng)該指定該局部變量為“靜態(tài)局部變量”,用關(guān)鍵字static進(jìn)行聲明。通過(guò)下面簡(jiǎn)單的例子可以了解它的特點(diǎn)。8.9.3用static聲明局部變量有時(shí)希望函數(shù)中的局部變例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);}例8.17考察靜態(tài)局部變量的值。對(duì)靜態(tài)局部變量的說(shuō)明:(1)靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)區(qū)空間而不占靜態(tài)存儲(chǔ)區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2)對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。而對(duì)自動(dòng)變量賦初值,不是在編譯時(shí)進(jìn)行的,而是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語(yǔ)句。對(duì)靜態(tài)局部變量的說(shuō)明:(3)如在定義局部變量時(shí)不賦初值的話,則對(duì)靜態(tài)局部變量來(lái)說(shuō),編譯時(shí)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來(lái)說(shuō),如果不賦初值則它的值是一個(gè)不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲(chǔ)單元已釋放,下次調(diào)用時(shí)又重新另分配存儲(chǔ)單元,而所分配的單元中的值是不確定的。(4)雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的。(3)如在定義局部變量時(shí)不賦初值的話,則對(duì)靜態(tài)局部變量來(lái)說(shuō),例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.18輸出1到5的階乘值。8.9.4register變量
一般情況下,變量(包括靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式)的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個(gè)變量的值時(shí),由控制器發(fā)出指令將內(nèi)存中該變量的值送到運(yùn)算器中。經(jīng)過(guò)運(yùn)算器進(jìn)行運(yùn)算,如果需要存數(shù),再?gòu)倪\(yùn)算器將數(shù)據(jù)送到內(nèi)存存放。8.9.4register變量一般情況下,變量(包括靜態(tài)如果有一些變量使用頻繁(例如在一個(gè)函數(shù)中執(zhí)行10000次循環(huán),每次循環(huán)中都要引用某局部變量),則為存取變量的值要花費(fèi)不少時(shí)間。為提高執(zhí)行效率,C語(yǔ)言允許將局部變量的值放在CPU中的寄存器中,需要用時(shí)直接從寄存器取出參加運(yùn)算,不必再到內(nèi)存中去存取。由于對(duì)寄存器的存取速度遠(yuǎn)高于對(duì)內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。例如,例8.19中的程序是輸出1到n的階乘的值。如果有一些變量使用頻繁(例如在一個(gè)函數(shù)中執(zhí)行10000次循環(huán)例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.19使用寄存器變量8.9.5用extern聲明外部變量外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲(chǔ)區(qū)。有時(shí)需要用extern來(lái)聲明外部變量,以擴(kuò)展外部變量的作用城。8.9.5用extern聲明外部變量外部變量是在函數(shù)的外部定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);}1.在一個(gè)文件內(nèi)聲明外部變量例8.20用extern聲明2.在多文件的程序中聲明外部變量例8.21用extern將外部變量的作用域擴(kuò)展到其他文件。本程序的作用是給定b的值,輸入a和m,求a×b和am的值。文件file1.c中的內(nèi)容為:#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);
}2.在多文件的程序中聲明外部變量例8.21用extern文件file2.c中的內(nèi)容為:externA;/*聲明A為一個(gè)已定義的外部變量*/intpower(intn);{inti,y=1;
for(i=1;i<=n;i++)y*=A;return(y);}文件file2.c中的內(nèi)容為:8.9.6用static聲明外部變量有時(shí)在程序設(shè)計(jì)中希望某些外部變量只限于被本文件引用,而不能被其他文件引用。這時(shí)可以在定義外部變量時(shí)加一個(gè)static聲明。例如:file1.cfile2.cstaticintA;externintA;voidmain()voidfun(intn){{……A=A*n;}8.9.6用static聲明外部變量有時(shí)在程序設(shè)計(jì)中希望某些8.9.7關(guān)于變量的聲明和定義對(duì)變量而言,聲明與定義的關(guān)系稍微復(fù)雜一些。在聲明部分出現(xiàn)的變量有兩種情況:一種是需要建立存儲(chǔ)空間的(如:inta;),另一種是不需要建立存儲(chǔ)空間的(如:externa;)。前者稱為“定義性聲明”(definingdeclaration),或簡(jiǎn)稱定義(definition)。后者稱為“引用性聲明”(referencingdeclaration)。廣義地說(shuō),聲明包括定義,但并非所有的聲明都是定義。對(duì)“inta;”而言,它既是聲明,又是定義。而對(duì)“externa;”而言,它是聲明而不是定義。8.9.7關(guān)于變量的聲明和定義對(duì)變量而言,聲明與定義的關(guān)系稍一般為了敘述方便,把建立存儲(chǔ)空間的聲明稱定義,而把不需要建立存儲(chǔ)空間的聲明稱為聲明。顯然這里指的聲明是狹義的,即非定義性聲明。例如:voidmain(){externA;/*是聲明不是定義。聲明A是一個(gè)已定義的外部變量*/…}intA;一般為了敘述方便,把建立存儲(chǔ)空間的聲明稱定義,而把不需要建立§8.9.8存儲(chǔ)類別小結(jié)(1)從作用域角度分,有局部變量和全局變量。它們采用的存儲(chǔ)類別如下:局部變量
|自動(dòng)變量,即動(dòng)態(tài)局部變量
(離開函數(shù),值就消失)
|靜態(tài)局部變量(離開函數(shù),值仍保留)
|寄存器變量(離開函數(shù),值就消失)
|(形式參數(shù)可以定義為自動(dòng)變量或寄存器變量)全局變量
|靜態(tài)外部變量(只限本文件引用)|外部變量
(即非靜態(tài)的外部變量,允許其他文件引用)§8.9.8存儲(chǔ)類別小結(jié)(1)從作用域角度分,有局部變量和(2)從變量存在的時(shí)間(生存期)來(lái)區(qū)分,有動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)兩種類型。靜態(tài)存儲(chǔ)是程序整個(gè)運(yùn)行時(shí)間都存在,而動(dòng)態(tài)存儲(chǔ)則是在調(diào)用函數(shù)時(shí)臨時(shí)分配單元。動(dòng)態(tài)存儲(chǔ)|自動(dòng)變量(本函數(shù)內(nèi)有效)|寄存器變量(本函數(shù)內(nèi)有效)|形式參數(shù)(本函數(shù)內(nèi)有效)靜態(tài)存儲(chǔ)
|靜態(tài)局部變量(函數(shù)內(nèi)有效)
|靜態(tài)外部變量(本文件內(nèi)有效)
|外部變量(其他文件可引用)(2)從變量存在的時(shí)間(生存期)來(lái)區(qū)分,有動(dòng)態(tài)存儲(chǔ)和靜態(tài)存(3)從變量值存放的位置來(lái)區(qū)分,可分為:內(nèi)存中靜態(tài)存儲(chǔ)區(qū)|靜態(tài)局部變量
|靜態(tài)外部變量(函數(shù)外部靜態(tài)變量)|外部變量(可為其他文件引用)內(nèi)存中動(dòng)態(tài)存儲(chǔ)區(qū):自動(dòng)變量和形式參數(shù)CPU中的寄存器:寄存器變量(3)從變量值存放的位置來(lái)區(qū)分,可分為:(4)關(guān)于作用域和生存期的概念。從前面敘述可以知道,對(duì)一個(gè)變量的性質(zhì)可以從兩個(gè)方面分析,一是變量的作用域,一是變量值存在時(shí)間的長(zhǎng)短,即生存期。前者是從空間的角度,后者是從時(shí)間的角度。二者有聯(lián)系但不是同一回事。(5)static對(duì)局部變量和全局變量的作用不同。對(duì)局部變量來(lái)說(shuō),它使變量由動(dòng)態(tài)存儲(chǔ)方式改變?yōu)殪o態(tài)存儲(chǔ)方式。而對(duì)全局變量來(lái)說(shuō),它使變量局部化(局部于本文件),但仍為靜態(tài)存儲(chǔ)方式。從作用域角度看,凡有static聲明的,其作用域都是局限的,或者是局限于本函數(shù)內(nèi)(靜態(tài)局部變量),或者局限于本文件內(nèi)(靜態(tài)外部變量)。(4)關(guān)于作用域和生存期的概念。從前面敘述可以知道,對(duì)一個(gè)§8.10內(nèi)部函數(shù)和外部函數(shù)
函數(shù)本質(zhì)上是全局的,因?yàn)橐粋€(gè)函數(shù)要被另外的函數(shù)調(diào)用,但是,也可以指定函數(shù)不能被其他文件調(diào)用。根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。§8.10.1內(nèi)部函數(shù)如果一個(gè)函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。在定義內(nèi)部函數(shù)時(shí),在函數(shù)名和函數(shù)類型的前面加static。即static類型標(biāo)識(shí)符函數(shù)名(形參表)如staticintfun(inta,intb)§8.10內(nèi)部函數(shù)和外部函數(shù)函數(shù)本質(zhì)上是全局的,因?yàn)橐粋€(gè)§8.10.2外部函數(shù)(1)在定義函數(shù)時(shí),如果在函數(shù)首部的最左端加關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。如函數(shù)首部可以寫為externintfun(inta,intb)這樣,函數(shù)fun就可以為其他文件調(diào)用。C語(yǔ)言規(guī)定,如果在定義函數(shù)時(shí)省略extern,則隱含為外部函數(shù)。本書前面所用的函數(shù)都是外部函數(shù)。(2)在需要調(diào)用此函數(shù)的文件中,用extern對(duì)函數(shù)作聲明,表示該函數(shù)是在其他文件中定義的外部函數(shù)
§8.10.2外部函數(shù)(1)在定義函數(shù)時(shí),如果在函數(shù)首部的例8.22有一個(gè)字符串,內(nèi)有若干個(gè)字符,今輸入一個(gè)字符,要求程序?qū)⒆址性撟址麆h去。用外部函數(shù)實(shí)現(xiàn)
File.c(文件1)#include<stdio.h>voidmain(){externvoidenter_string(charstr[]);externvoiddetele_string(charstr[],charch);externvoidprint_string(charstr[]);/*以上3行聲明在本函數(shù)中將要調(diào)用的在其他文件中定義的3個(gè)函數(shù)*/
charc;charstr[80];scanf("%c",&c);detele_string(str,c);print_string(str);}例8.22有一個(gè)字符串,內(nèi)有若干個(gè)字符,今輸入一個(gè)字符,file2.c(文件2)
#include<stdio.h>voidenter_string(charstr[80])/*定義外部函數(shù)
enter-string*/
{gets(str);/*向字符數(shù)組輸入字符串*/
}
file3.c(文件3)voiddelete_string(charstr[],charch)/*定義外部函數(shù)
delete_string*/{inti,j;for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i];str[i]='\0';}file2.c(文件2)file4.c(文件4)#include<stdio.h>voidprint_string(charstr[]){printf("%s\n",str);}
運(yùn)行情況如下:abcdefgc↙(輸入str)c↙(輸入要?jiǎng)h去的字符)abdefg(輸出已刪去指定字符的字符串)file4.c(文件4)運(yùn)行情況如下:第九章預(yù)處理命令第九章預(yù)處理命令
本章要點(diǎn)預(yù)處理的概念C語(yǔ)言處理系統(tǒng)的預(yù)處理功能預(yù)處理命令的使用本章要點(diǎn)預(yù)處理的概念
主要內(nèi)容9.1宏定義9.2“文件包含”處理9.3條件編譯主要內(nèi)容9.1宏定義
基本概念A(yù)NSIC標(biāo)準(zhǔn)規(guī)定可以在C源程序中加入一些“預(yù)處理命令”,以改進(jìn)程序設(shè)計(jì)環(huán)境,提高編程效率。這些預(yù)處理命令是由ANSIC統(tǒng)一規(guī)定的,但是它不是C語(yǔ)言本身的組成部分,不能直接對(duì)它們進(jìn)行編譯(因?yàn)榫幾g程序不能識(shí)別它們)。必須在對(duì)程序進(jìn)行通常的編譯之前,先對(duì)程序中這些特殊的命令進(jìn)行“預(yù)處理”經(jīng)過(guò)預(yù)處理后程序可由編譯程序?qū)︻A(yù)處理后的源程序進(jìn)行通常的編譯處理,得到可供執(zhí)行的目標(biāo)代碼?;靖拍預(yù)NSIC標(biāo)準(zhǔn)規(guī)定可以在C源程序中加入一些“預(yù)處
基本概念C語(yǔ)言與其他高級(jí)語(yǔ)言的一個(gè)重要區(qū)別是可以使用預(yù)處理命令和具有預(yù)處理的功能。C提供的預(yù)處理功能主要有以下三種:1.宏定義2.文件包含3.條件編譯這些功能分別用宏定義命令、文件包含命令、條件編譯命令來(lái)實(shí)現(xiàn)。為了與一般C語(yǔ)句相區(qū)別,這些命令以符號(hào)“#”開頭。例如:
#define#include基本概念C語(yǔ)言與其他高級(jí)語(yǔ)言的一個(gè)重要區(qū)別是可以使用預(yù)處理
§9.1宏定義9.1.1不帶參數(shù)的宏定義
宏定義一般形式為:#define標(biāo)識(shí)符字符串例如:#definePI3.1415926宏定義的作用是在本程序文件中用指定的標(biāo)識(shí)符PI來(lái)代替“3.1415926”這個(gè)字符串,在編譯預(yù)處理時(shí),將程序中在該命令以后出現(xiàn)的所有的PI都用“3.1415926”代替。這種方法使用戶能以一個(gè)簡(jiǎn)單的名字代替一個(gè)長(zhǎng)的字符串.這個(gè)標(biāo)識(shí)符(名字)稱為“宏名”在預(yù)編譯時(shí)將宏名替換成字符串的過(guò)程稱為“宏展開”。#define是宏定義命令?!?.1宏定義9.1.1不帶參數(shù)的宏定義宏定義一般#include<stdio.h>#definePI3.1415926voidmain(){floatl,s,r,v;printf("inputradius:");scanf("%f",&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v);}例9.1使用不帶參數(shù)的宏定義
#include<stdio.h>例9.1使用不帶參數(shù)的inputradius:4↙
運(yùn)行情況如下:1=25.1328s=50.2655v=150.7966(1)宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別。但這并非規(guī)定,也可用小寫字母。(2)使用宏名代替一個(gè)字符串,可以減少程序中重復(fù)書寫某些字符串的工作量。(3)宏定義是用宏名代替一個(gè)字符串,只作簡(jiǎn)單置換,不作正確性檢查。只有在編譯已被宏展開后的源程序時(shí)才會(huì)發(fā)現(xiàn)語(yǔ)法錯(cuò)誤并報(bào)錯(cuò)。說(shuō)明:inputradius:4↙運(yùn)行情況如下:1=25(4)宏定義不是C語(yǔ)句,不必在行末加分號(hào)。如果加了分號(hào)則會(huì)連分號(hào)一起進(jìn)行置換。(5)#define命令出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件結(jié)束。通常,#define命令寫在文件開頭,函數(shù)之前,作為文件一部分,在此文件范圍內(nèi)有效。(6)可以用#undef命令終止宏定義的作用域。例如:說(shuō)明:(4)宏定義不是C語(yǔ)句,不必在行末加分號(hào)。如果加了分號(hào)則會(huì)#defineG9.8_______voidmain()↑{G的有效范圍
…}-----↓----#undefGf1(){…}在f1函數(shù)中,G不再代表9.8。這樣可以靈活控制宏定義的作用范圍。#defineG9.8__(7)在進(jìn)行宏定義時(shí),可以引用已定義的宏名,可以層層置換。說(shuō)明:#include<stdio.h>#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rvoidmain(){printf("L=%f\nS=%f\n",L,S);}運(yùn)行情況如下:L=18.849556S=28.274333例9.2在宏定義中引用已定義的宏名
(7)在進(jìn)行宏定義時(shí),可以引用已定義的宏名,可以層層置換。經(jīng)過(guò)宏展開后,printf函數(shù)中的輸出項(xiàng)L被展開為:
2*3.1415926*3.0S展開為
3.1415926*3.0*3.0printf函數(shù)調(diào)用語(yǔ)句展開為:printf(“L=%F\NS=%f\n”,2*3.1415926*3.0,3.1415926*3.0*3.0);經(jīng)過(guò)宏展開后,printf函數(shù)中的輸出項(xiàng)L被展開為:prin(8)對(duì)程序中用雙撇號(hào)括起來(lái)的字符串內(nèi)的字符,即使與宏名相同,也不進(jìn)行置換。(9)宏定義是專門用于預(yù)處理命令的一個(gè)專用名詞,它與定義變量的含義不同,只作字符替換,不分配內(nèi)存空間。說(shuō)明:(8)對(duì)程序中用雙撇號(hào)括起來(lái)的字符串內(nèi)的字符,即使與宏名相
9.1.2帶參數(shù)的宏定義
作用:不是進(jìn)行簡(jiǎn)單的字符串替換,還要進(jìn)行參數(shù)替換。
帶參數(shù)的宏定義一般形式為:#define
宏名(參數(shù)表)字符串字符串中包含在括弧中所指定的參數(shù)#define
S(a,b)a*b
area=S(3,2);程序中用3和2分別代替宏定義中的形式參數(shù)a和b,用3*2代替S(3,2)
。因此賦值語(yǔ)句展開為:area=3*2例:9.1.2帶參數(shù)的宏定義作用:不是進(jìn)行簡(jiǎn)單的字符對(duì)帶實(shí)參的宏(如S(3,2),則按#define命令行中指定的字符串從左到右進(jìn)行置換。若串中包含宏中的形參(如a、b),則將程序中相應(yīng)的實(shí)參(可以是常量、變量或表達(dá)式)代替形參。如果宏定義中的字符串中的字符不是參數(shù)字符(如a*b中的*號(hào)),則保留。這樣就形成了置換的字符串。對(duì)帶參的宏定義是這樣展開置換的:對(duì)帶實(shí)參的宏(如S(3,2),則按#define命令行中指定#include<stdio.h>#definePI3.1415926#defineS(r)PI*r*rvoidmain(){floata,area;a=3.6;area=S(a);printf("r=%f\narea=%f\n",a,area);}運(yùn)行情況如下:r=3.600000area=40.715038例9.3使用帶參的宏
賦值語(yǔ)句“area=S(a);
”
經(jīng)宏展開后為:area=3.1415926*a*a;#include<stdio.h>運(yùn)行情況如下:r=3.6(1)對(duì)帶參數(shù)的宏展開只是將語(yǔ)句中的宏名后面括號(hào)內(nèi)的實(shí)參字符串代替#define
命令行中的形參。(2)在宏定義時(shí),在宏名與帶參數(shù)的括弧之間不應(yīng)加空格,否則將空格以后的字符都作為替代字符串的一部分。說(shuō)明:(1)對(duì)帶參數(shù)的宏展開只是將語(yǔ)句中的宏名后面括號(hào)內(nèi)的實(shí)參字符(1)函數(shù)調(diào)用時(shí),先求出實(shí)參表達(dá)式的值,然后代入形參。而使用帶參的宏只是進(jìn)行簡(jiǎn)單的字符替換。(2)函數(shù)調(diào)用是在程序運(yùn)行時(shí)處理的,為形參分配臨時(shí)的內(nèi)存單元。而宏展開則是在編譯前進(jìn)行的,在展開時(shí)并不分配內(nèi)存單元,不進(jìn)行值的傳遞處理,也沒有“返回值”的概念。(3)對(duì)函數(shù)中的實(shí)參和形參類型要求一致。而宏名無(wú)類型,它的參數(shù)也無(wú)類型,只是一個(gè)符號(hào)代表,展開時(shí)代入指定的字符串即可。宏定義時(shí),字符串可以是任何類型的數(shù)據(jù)。(4)調(diào)用函數(shù)只可得到一個(gè)返回值,而用宏可以設(shè)法得到幾個(gè)結(jié)果。帶參數(shù)的宏和函數(shù)的區(qū)別:(1)函數(shù)調(diào)用時(shí),先求出實(shí)參表達(dá)式的值,然后代入形參。而使#include<stdio.h>#definePI3.1415926#defineCIRCLE(R,L,S,V)L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*Rvoidmain(){floatr,l,s,v;scanf("%f",&r);CIRCLE(r,l,s,v);printf("r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2f\n",r,l,s,v);}例9.4通過(guò)宏展開得到若干個(gè)結(jié)果#include<stdio.h>例9.4通過(guò)宏展開得到voidmain()
{floatr,l,s,v;scanf("%f",&r);
l=2*3.1415926*r;s=3.1515926*r*r;v=4.0/3/0*3.1415926*r*r*r;
printf(”r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2f\n”,r,l,s,v);
}對(duì)宏進(jìn)行預(yù)編譯,展開后的main函數(shù)如下:運(yùn)行情況如下:3.5↙r=3.50,l=21.99,s=38.48,v=179.59voidmain()對(duì)宏進(jìn)行預(yù)編譯,展開后的main函數(shù)如(5)使用宏次數(shù)多時(shí),宏展開后源程序長(zhǎng),因?yàn)槊空归_一次都使程序增長(zhǎng),而函數(shù)調(diào)用不會(huì)使源程序變長(zhǎng)。(6)宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間。而函數(shù)調(diào)用則占運(yùn)行時(shí)間(分配單元、保留現(xiàn)場(chǎng)、值傳遞、返回)。帶參數(shù)的宏和函數(shù)的區(qū)別:
如果善于利用宏定義,可以實(shí)現(xiàn)程序的簡(jiǎn)化,如事先將程序中的“輸出格式”定義好,以減少在輸出語(yǔ)句中每次都要寫出具體的輸出格式的麻煩。(5)使用宏次數(shù)多時(shí),宏展開后源程序長(zhǎng),因?yàn)槊空归_一次都使例9.5通過(guò)宏展開得到若干個(gè)結(jié)果#include<stdio.h>#definePRprintf#defineNL"\n"#defineD"%d"#defineD1DNL#defineD2DDNL#defineD3DDDNL#defineD4DDDDNL#defineS"%s"voidmain(){inta,b,c,d;charstring[]="CHINA";a=1;b=2;c=3;d=4;PR(D1,a);PR(D2,a,b);PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);}運(yùn)行時(shí)輸出結(jié)果:1121231234CHINA例9.5通過(guò)宏展開得到若干個(gè)結(jié)果#include<std所謂“文件包含”處理是指一個(gè)源文件可以將另外一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來(lái)。C語(yǔ)言提供了#include命令用來(lái)實(shí)現(xiàn)“文件包含”的操作。其一般形式為:#include"文件名"或#include<文件名>
§9.2“文件包含”處理所謂“文件包含”處理是指一個(gè)源文件可以將另外一個(gè)源文件的全部例9.6將例9.5時(shí)格式宏做成頭文件,把它包含在用戶程序中。(1)將格式宏做成頭文件format.h
#include<stdio.h>#definePRprintf#defineNL"\n"#defineD"%d"#defineD1DNL#defineD2DDNL#defineD3DDDNL#defineD4DDDDNL#defineS"%s"(2)主文件file1.c#include<stdio.h>#include"format.h"voidmain(){inta,b,c,d;charstring[]="CHINA";a=1;b=2;c=3;d=4;PR(D1,a);PR(D2,a,b);PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);}例9.6將例9.5時(shí)格式宏做成頭文件,把它包含在用戶程序中注意:
在編譯時(shí)并不是分別對(duì)兩個(gè)文件分別進(jìn)行編譯,然后再將它們的目標(biāo)程序連接的,而是在經(jīng)過(guò)編譯預(yù)處理后將頭文件format.h包含到主文件中,得到一個(gè)新的源程序,然后對(duì)這個(gè)文件進(jìn)行編譯,得到一個(gè)目標(biāo)(.obj)文件。被包含的文件成為新的源文件的一部分,而單獨(dú)生成目標(biāo)文件。注意:(1)一個(gè)#include命令只能指定一個(gè)被包含文件,如果要包含n個(gè)文件,要用n個(gè)#include命令。(2)如果文件1包含文件2,而在文件2中要用到文件3的內(nèi)容,則可在文件1中用兩個(gè)include命令分別包含文件2和文件3,而且文件3應(yīng)出現(xiàn)在文件2之前,即在file1.c中定義。(3)在一個(gè)被包含文件中又可以包含另一個(gè)被包含文件,即文件包含是可以嵌套的。說(shuō)明:(1)一個(gè)#include命令只能指定一個(gè)被包含文件,如果C語(yǔ)言程序設(shè)計(jì)教學(xué)課件(4)在#include命令中,文件名可以用雙撇號(hào)或尖括號(hào)括起來(lái)。(5)被包含文件(file2.h)與其所在的文件(即用#include命令的源文件file2.c),在預(yù)編譯后已成為同一個(gè)文件(而不是兩個(gè)文件)。因此,如果file2.h中有全局靜態(tài)變量,它也在file1.h文件中有效,不必用extern聲明。說(shuō)明:(4)在#include命令中,文件名可以用雙撇號(hào)或尖括號(hào)
§9.3條件編譯概念:所謂“條件編譯”,是對(duì)部分內(nèi)容指定編譯的條件,使其只在滿足一定條件才進(jìn)行編譯。條件編譯命令的幾種形式:(1)#ifdef標(biāo)識(shí)符程序段1#else
程序段2#endif(2)#ifndef標(biāo)識(shí)符程序段1#else
程序段2#endif(3)#if表達(dá)式程序段1#else
程序段2#endif§9.3條件編譯概念:所謂“條件編譯”,是對(duì)部分內(nèi)容指定例9.7輸入一行字母字符,根據(jù)需要設(shè)置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出。#include<stdio.h>#defineLETTER1voidmain(){charstr[20]="CLanguage",c;inti;i=0;while((c=str[i])!='\0'){i++;
#ifLETTERif(c>='a'&&c<='z')c=c-32;#elseif(c>='A'&&c<='Z')c=c+32;#endifprintf("%c",c);}}運(yùn)行結(jié)果為:CLANGUAGE例9.7輸入一行字母字符,根據(jù)需要設(shè)置條件編譯,使之能將第十章指針第十章指針§10.1地址和指針的概念為了說(shuō)清楚什么是指針,必須弄清楚數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)的,又是如何讀取的。內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),這就是“地址”。如果在程序中定義了一個(gè)變量,在對(duì)程序進(jìn)行編譯時(shí),系統(tǒng)就會(huì)給這個(gè)變量分配內(nèi)存單元。1、按變量地址存取變量值的方式稱為“直接訪問”方式printf(″%d″,i);scanf(″%d″,&i);k=i+j;例如:§10.1地址和指針的概念為了說(shuō)清楚什么是指針,必須弄清楚數(shù)C語(yǔ)言程序設(shè)計(jì)教學(xué)課件另一種存取變量值的方式稱為“間接訪問”的方式。即,將變量i的地址存放在另一個(gè)變量中。在C語(yǔ)言中,指針是一種特殊的變量,它是存放地址的。假設(shè)我們定義了一個(gè)指針變量i_pointer用來(lái)存放整型變量的地址,它被分配地址為(3010)、(3011)的兩個(gè)字節(jié)??梢酝ㄟ^(guò)語(yǔ)句:i_pointer=&i;將i的地址(2000)存放到i_pointer中。這時(shí),
i_pointer的值就是(2000),即變量i所占用單元的起始地址。要存取變量i的值,可以采用間接方式:先找到存放“i的地址”的變量i_pointer
,從中取出i的地址(2000),然后到2000、2001字節(jié)取出i的值(3)。另一種存取變量值的方式稱為“間接訪問”的方式。即,將變量i的C語(yǔ)言程序設(shè)計(jì)教學(xué)課件一個(gè)變量的地址稱為該變量的“指針”。例如,地址2000是變量i的指針。如果有一個(gè)變量專門用來(lái)存放另一變量的地址(即指針),則它稱為“指針變量”。上述的i_pointer就是一個(gè)指針變量。指針和指針變量的定義:指針變量的值(即指針變量中存放的值)是地址(即指針)。請(qǐng)區(qū)分“指針”和“指針變量”這兩個(gè)概念。一個(gè)變量的地址稱為該變量的“指針”。指針和指針變量的定義:指§10.2變量的指針和指向變量的指針變量10.2.1定義一個(gè)指針變量定義指針變量的一般形式為基類型*指針變量名;§10.2變量的指針和指向變量的指針變量10.2.1定義下面都是合法的定義:float*pointer_3;//pointer_3是指向float型變量的指針變量char*pointer_4;//pointer_4是指向字符型變量的指針變量可以用賦值語(yǔ)句使一個(gè)指針變量得到另一個(gè)變量的地址,從而使它指向一個(gè)該變量。如:pointer_1=&i;pointer_2=&j;下面都是合法的定義:在定義指針變量時(shí)要注意兩點(diǎn):指針變量前面的“*”,表示該變量的類型為指針型變量。例:float*pointer_1;指針變量名是pointer_1
,而不是*pointer_1
。(2)在定義指針變量時(shí)必須指定基類型。需要特別注意的是,只有整型變量的地址才能放到指向整型變量的指針變量中。下面的賦值是錯(cuò)誤的∶
floata;int*pointer_1;pointer_1=&a;/*將float型變量的地址放到指向整型變量的指針變量中,錯(cuò)誤*/在定義指針變量時(shí)要注意兩點(diǎn):指針變量前面的“*”,表示該變量10.2.2指針變量的引用
請(qǐng)牢記,指針變量中只能存放地址(指針),不要將一個(gè)整數(shù)(或任何其他非地址類型的數(shù)據(jù))賦給一個(gè)指針變量。
例10.1通過(guò)指針變量訪問整型變量#include<stdio.h>void
main(){inta,b;
int*pointer_1,*pointer_2;a=100;b=10;
pointer_1=&a;/*把變量a的地址賦給
pointer_1*/
10.2.2指針變量的引用請(qǐng)牢記,指針變量中只能存放地址pointer_2=&b;/*把變量b的地址賦給
pointer_2*/printf(″%d,%d\n″,a,b);printf(″%d,%d\n″,*pointer_1,*pointer_2);}pointer_2=&b;/*把變量b的地址賦給對(duì)“&”和“*”運(yùn)算符說(shuō)明:如果已執(zhí)行了語(yǔ)句pointer_1=&a;(1)&*
pointer_1的含義是什么?“&”和“*”兩個(gè)運(yùn)算符的優(yōu)先級(jí)別相同,但按自右而左方向結(jié)合,因此先進(jìn)行*
pointer_1的運(yùn)算,它就是變量a,再執(zhí)行&運(yùn)算。因此,&*
pointer_1與&a相同,即變量a的地址。如果有pointer_2
=&*
pointer_1;它的作用是將&a(a的地址)賦給pointer_2
,如果pointer_2原來(lái)指向b,經(jīng)過(guò)重新賦值后它已不再指向b了,而指向了a。對(duì)“&”和“*”運(yùn)算符說(shuō)明:C語(yǔ)言程序設(shè)計(jì)教學(xué)課件(2)*&a的含義是什么?先進(jìn)行&a運(yùn)算,得a的地址,再進(jìn)行*運(yùn)算。即&a所指向的變量,也就是變量a。*&a和*pointer_1的作用是一樣的,它們都等價(jià)于變量a。即*&a與a等價(jià)。(3)
(*pointer_1)++相當(dāng)于a++。注意括號(hào)是必要的,如果沒有括號(hào),就成為了*pointer_1++,從附錄可知:++和*為同一優(yōu)先級(jí)別,而結(jié)合方向?yàn)樽杂叶?,因此它相?dāng)于*(pointer_1++)。由于++在pointer_1的右側(cè),是“后加”,因此先對(duì)pointer_1的原值進(jìn)行*運(yùn)算,得到a的值,然后使pointer_1的值改變,這樣pointer_1不再指向a了。(2)*&a的含義是什么?先進(jìn)行&a運(yùn)算,得a的地址,再進(jìn)例10.2輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a和b。#include<stdio.h>voidmain(){int*p1,*p2,*p,a,b;
scanf(″%d,%d″,&a,&b);p1=&a;p2=&b;
if(a<b){p=p1;p1=p2;p2=p;}
printf(″a=%d,b=%d\n\n″,a,b);
printf(″max=%d,min=%d\n″,*p1,*p2);}例10.2輸入a和b兩個(gè)整數(shù),按先大后小的順序輸運(yùn)行情況如下:5,9↙a=5,b=9max=9,min=5當(dāng)輸入a=5,b=9時(shí),由于a<b,將p1和p2交換。交換前的情況見圖(a),交換后見圖(b)。運(yùn)行情況如下:C語(yǔ)言程序設(shè)計(jì)教學(xué)課件10.2.3指針變量作為函數(shù)參數(shù)例10.3對(duì)輸入的兩個(gè)整數(shù)按大小順序輸出
#include<stdio.h>voidmain(){voidswap(int*p1,int*p2);
inta,b;
int*pointer_1,*pointer_2;
scanf(″%d,%d″,&a,&b);
pointer_1=&a;pointer_2=&b;
if(a<b=swap(pointer_1,pointer_2);
printf(″\n%d,%d\n″,a,b);
}
10.2.3指針變量作為函數(shù)參數(shù)例10.3對(duì)輸入的voidswap(int*p1,int*p2){
inttemp;
temp=*p1;*p1=*p2;*p2=temp;
}voidswap(int*p1,int*p2)C語(yǔ)言程序設(shè)計(jì)教學(xué)課件例10.4輸入a、b、c3個(gè)整數(shù),按大小順序輸出#include<stdio.h>voidmain(){
voidexchange(int*q1,int*q2,int*q3);
inta,b,c,*p1,*p2,*p3;
scanf(″%d,%d,%d″,&a,&b,&c);p1=&a;p2=&b;p3=&c;
exchange(p1,p2,p3);
printf(″\n%d,%d,%d\n″,a,b,c);
}例10.4輸入a、b、c3個(gè)整數(shù),按大小順序輸出#incvoidexchange(int*q1,int*q2,int*q3){voidswap(int*pt1,int*pt2);if(*q1<*q2)swap(q1,q2);
if(*q1<*q3)swap(q1,q3);
if(*q2<*q3=swap(q2,q3);
}
voidswap(int*pt1,int*pt2)
{inttemp;
temp=*pt1;*pt1=*pt2;*pt2=temp;
}
voidexchange(int*q1,int*q§10.3數(shù)組與指針
一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址放到一個(gè)指針變量中)。所謂數(shù)組元素的指針就是數(shù)組元素的地址?!?0.3數(shù)組與指針一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指向變量的指針變量相同。例如:inta[10];
(定義a為包含10個(gè)整型數(shù)據(jù)的數(shù)組)int*p;
(定義p為指向整型變量的指針變量)應(yīng)當(dāng)注意,如果數(shù)組為int型,則指針變量的基類型亦應(yīng)為int型。
10.3.1指向數(shù)組元素的指針定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指向變量的對(duì)該指針變量賦值:p=&a[0];把a[0]元素的地址賦給指針變量p。也就是使p指向a數(shù)組的第0號(hào)元素,如圖:對(duì)該指針變量賦值:10.3.2通過(guò)指針引用數(shù)組元素引用一個(gè)數(shù)組元素,可以用:
(1)下標(biāo)法,如a[i]形式;(2)指針法,如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組元素的指針變量,其初值p=a。例10.5輸出數(shù)組中的全部元素
假設(shè)有一個(gè)a數(shù)組,整型,有10個(gè)元素。要輸出各元素的值有三種方法:10.3.2通過(guò)指針引用數(shù)組元素引用一個(gè)數(shù)組元素,可以用:例(1)下標(biāo)法#include<stdio.h>voidmain(){
inta[10];
inti;
for(i=0;i<10;i++)
scanf(″%d″,&a[i]);
printf(″\n″);
for(i=0;i<10;i++)
printf(″%d″,a[i]);
}(1)下標(biāo)法(2)通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。#include<stdio.h>void
main(){
inta[10];
inti;
for(i=0;i<10;i++)
scanf(″%d″,&a[i]);
printf(″\n″);
for(i=0;i<10;i++)
printf(″%d″,*(a+i));
}(2)通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。(3)
用指針變量指向數(shù)組元素。#include<stdio.h>voidmain(){
inta[10];
int*p,i;
for(i=0;i<10;i++)
scanf(″%d″,&a[i]);
printf(″\n″);
for(p=a;p<(a+10);p++)
printf(″%d″,*p);
}(3)用指針變量指向數(shù)組元素。例10.6通過(guò)指針變量輸出a數(shù)組的10個(gè)元素。
有人編寫出以下程序:#include<stdio.h>voidmain(){
int*p,i,a[10];p=a;
for(i=0;i<10;i++)
scanf(″%d″,p++);
printf(″\n″);
for(i=0;i<10;i++,p++)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 吉利學(xué)院《中學(xué)歷史課堂教學(xué)藝術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 宜春幼兒師范高等專科學(xué)?!锻亮W(xué)與地基基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025學(xué)年廈門市第六中學(xué)高考考前適應(yīng)性測(cè)試英語(yǔ)試題含解析
- 長(zhǎng)沙衛(wèi)生職業(yè)學(xué)院《網(wǎng)絡(luò)操作系統(tǒng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 公共交通運(yùn)營(yíng)成本控制制度
- 工程設(shè)備采購(gòu)管理措施
- 四川省瀘州市2024-2025學(xué)年高一上學(xué)期1月期末統(tǒng)一考試數(shù)學(xué)試題(解析版)
- 拱橋總體施工方案
- 高空伐樹作業(yè)施工方案
- 征地界樁施工方案
- 腦血栓康復(fù)期的護(hù)理
- 2024年北京市重點(diǎn)建設(shè)項(xiàng)目政府投資計(jì)劃項(xiàng)目
- 金屬冶煉安全事故案例與分析
- 《柯高峰行政監(jiān)察學(xué)》課件
- 2024城市道路路面維修養(yǎng)護(hù)技術(shù)規(guī)程
- 老年糖尿病夜間低血糖的預(yù)防及護(hù)理
- 梅毒病人產(chǎn)后護(hù)理查房
- 小班-語(yǔ)言社會(huì)-幸福的“叮咚”-課件(基礎(chǔ)版)公開課教案教學(xué)設(shè)計(jì)課件案例試卷
- 專業(yè)培訓(xùn)金蝶k3wise供應(yīng)鏈系統(tǒng)培訓(xùn)
- 辦公耗材采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 《干部履歷表》填寫樣式
評(píng)論
0/150
提交評(píng)論