二、數(shù)組名作為函數(shù)參數(shù)
用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作實(shí)參有幾點(diǎn)不同:
1. 用數(shù)組元素作實(shí)參時(shí),只要數(shù)組類型和函數(shù)的形參變量的類型一致,那么作為下標(biāo)變量的數(shù)組元素的類型也和函數(shù)形參變量的類型是一致的。因此, 并不要求函數(shù)的形參也是下標(biāo)變量。 換句話說,對數(shù)組元素的處理是按普通變量對待的。用數(shù)組名作函數(shù)參數(shù)時(shí), 則要求形參和相對應(yīng)的實(shí)參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明。當(dāng)形參和實(shí)參二者不一致時(shí),即會(huì)發(fā)生錯(cuò)誤。
2. 在普通變量或下標(biāo)變量作函數(shù)參數(shù)時(shí),形參變量和實(shí)參變量是由編譯系統(tǒng)分配的兩個(gè)不同的內(nèi)存單元。在函數(shù)調(diào)用時(shí)發(fā)生的值傳送是把實(shí)參變量的值賦予形參變量。在用數(shù)組名作函數(shù)參數(shù)時(shí),不是進(jìn)行值的傳送,即不是把實(shí)參數(shù)組的每一個(gè)元素的值都賦予形參數(shù)組的各個(gè)元素。因?yàn)閷?shí)際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。那么,數(shù)據(jù)的傳送是如何實(shí)現(xiàn)的呢? 在第四章中我們曾介紹過,數(shù)組名就是數(shù)組的首地址。因此在數(shù)組名作函數(shù)參數(shù)時(shí)所進(jìn)行的傳送只是地址的傳送, 也就是說把實(shí)參數(shù)組的首地址賦予形參數(shù)組名。形參數(shù)組名取得該首地址之后,也就等于有了實(shí)在的數(shù)組。實(shí)際上是形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。圖5.1說明了這種情形。圖中設(shè)a為實(shí)參數(shù)組,類型為整型。a占有以2000 為首地址的一塊內(nèi)存區(qū)。b為形參數(shù)組名。當(dāng)發(fā)生函數(shù)調(diào)用時(shí),進(jìn)行地址傳送, 把實(shí)參數(shù) 組a的首地址傳送給形參數(shù)組名b,于是b也取得該地址2000。 于是a,b兩數(shù)組共同占有以2000 為首地址的一段連續(xù)內(nèi)存單元。從圖中還可以看出a和b下標(biāo)相同的元素實(shí)際上也占相同的兩個(gè)內(nèi)
存單元(整型數(shù)組每個(gè)元素占二字節(jié))。例如a[0]和b[0]都占用2000和2001單元,當(dāng)然a[0]等于b[0]。類推則有a[i]等于b[i]。
[例5.5]數(shù)組a中存放了一個(gè)學(xué)生5門課程的成績,求平均成績。
float aver(float a[5])
{
int i;
float av,s=a[0];
for(i=1;i<5;i++)
s=s+a[i];
av=s/5;
return av;
}
void main()
{
float sco[5],av;
int i;
printf("\ninput 5 scores:\n");
for(i=0;i<5;i++)
scanf("%f",&sco[i]);
av=aver(sco);
printf("average score is %5.2f",av);
}
float aver(float a[5])
{ ……
}
void main()
{
……
for(i=0;i<5;i++)
scanf("%f",&sco[i]);
av=aver(sco);
……
}
本程序首先定義了一個(gè)實(shí)型函數(shù)aver,有一個(gè)形參為實(shí)型數(shù)組a,長度為5。在函數(shù)aver中,把各元素值相加求出平均值,返回給主函數(shù)。主函數(shù)main 中首先完成數(shù)組sco的輸入,然后以sco作為實(shí)參調(diào)用aver函數(shù),函數(shù)返回值送av,最后輸出av值。 從運(yùn)行情況可以看出,程序?qū)崿F(xiàn)了所要求的功能
3. 前面已經(jīng)討論過,在變量作函數(shù)參數(shù)時(shí),所進(jìn)行的值傳送是單向的。即只能從實(shí)參傳向形參,不能從形參傳回實(shí)參。形參的初值和實(shí)參相同, 而形參的值發(fā)生改變后,實(shí)參并不變化, 兩者的終值是不同的。例5.3證實(shí)了這個(gè)結(jié)論。 而當(dāng)用數(shù)組名作函數(shù)參數(shù)時(shí),情況則不同。 由于實(shí)際上形參和實(shí)參為同一數(shù)組, 因此當(dāng)形參數(shù)組發(fā)生變化時(shí),實(shí)參數(shù)組也隨之變化。 當(dāng)然這種情況不能理解為發(fā)生了“雙向”的值傳遞。但從實(shí)際情況來看,調(diào)用函數(shù)之后實(shí)參數(shù)組的值將由于形參數(shù)組值的變化而變化。為了說明這種情況,把例5.4改為例5.6的形式。[例5.6]題目同5.4例。改用數(shù)組名作函數(shù)參數(shù)。
void nzp(int a[5])
{
int i;
printf("\nvalues of array a are:\n");
for(i=0;i<5;i++)
{
if(a[i]<0) a[i]=0;
printf("%d ",a[i]);
}
}
main()
{
int b[5],i;
printf("\ninput 5 numbers:\n");
for(i=0;i<5;i++)
scanf("%d",&b[i]);
printf("initial values of array b are:\n");
for(i=0;i<5;i++)
printf("%d ",b[i]);
nzp(b);
printf("\nlast values of array b are:\n");
for(i=0;i<5;i++)
printf("%d ",b[i]);
}
void nzp(int a[5])
{ ……
}
main()
{
int b[5],i;
……
nzp(b);
……
}
本程序中函數(shù)nzp的形參為整數(shù)組a,長度為 5。 主函數(shù)中實(shí)參數(shù)組b也為整型,長度也為5。在主函數(shù)中首先輸入數(shù)組b的值,然后輸出數(shù)組b的初始值。 然后以數(shù)組名b為實(shí)參調(diào)用nzp函數(shù)。在nzp中,按要求把負(fù)值單元清0,并輸出形參數(shù)組a的值。 返回主函數(shù)之后,再次輸出數(shù)組b的值。從運(yùn)行結(jié)果可以看出,數(shù)組b 的初值和終值是不同的,數(shù)組b 的終值和數(shù)組a是相同的。這說明實(shí)參形參為同一數(shù)組,它們的值同時(shí)得以改變。 用數(shù)組名作為函數(shù)參數(shù)時(shí)還應(yīng)注意以下幾點(diǎn):
a. 形參數(shù)組和實(shí)參數(shù)組的類型必須一致,否則將引起錯(cuò)誤。
b. 形參數(shù)組和實(shí)參數(shù)組的長度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而不檢查形參數(shù)組的長度。當(dāng)形參數(shù)組的長度與實(shí)參數(shù)組不一致時(shí),雖不至于出現(xiàn)語法錯(cuò)誤(編譯能通過),但程序執(zhí)行結(jié)果將與實(shí)際不符,這是應(yīng)予以注意的。如把例5.6修改如下:
void nzp(int a[8])
{
int i;
printf("\nvalues of array aare:\n");
for(i=0;i<8;i++)
{
if(a[i]<0)a[i]=0;
printf("%d",a[i]);
}
}
main()
{
int b[5],i;
printf("\ninput 5 numbers:\n");
for(i=0;i<5;i++)
scanf("%d",&b[i]);
printf("initial values of array b are:\n");
for(i=0;i<5;i++)
printf("%d",b[i]);
nzp(b);
printf("\nlast values of array b are:\n");
for(i=0;i<5;i++)
printf("%d",b[i]);
}
本程序與例5.6程序比,nzp函數(shù)的形參數(shù)組長度改為8,函數(shù)體中,for語句的循環(huán)條件也改為i<8。因此,形參數(shù)組 a和實(shí)參數(shù)組b的長度不一致。編譯能夠通過,但從結(jié)果看,數(shù)組a的元素a[5],a[6],a[7]顯然是無意義的。c. 在函數(shù)形參表中,允許不給出形參數(shù)組的長度,或用一個(gè)變量來表示數(shù)組元素的個(gè)數(shù)。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |