二、數組名作為函數參數
用數組名作函數參數與用數組元素作實參有幾點不同:
1. 用數組元素作實參時,只要數組類型和函數的形參變量的類型一致,那么作為下標變量的數組元素的類型也和函數形參變量的類型是一致的。因此,并不要求函數的形參也是下標變量,換句話說,對數組元素的處理是按普通變量對待的。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。當形參和實參二者不一致時,即會發(fā)生錯誤。
2. 在普通變量或下標變量作函數參數時,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的內存單元。在函數調用時發(fā)生的值傳送是把實參變量的值賦予形參變量。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組并不存在,編譯系統(tǒng)不為形參數組分配內存。那么,數據的傳送是如何實現的呢? 在第四章中我們曾介紹過,數組名就是數組的首地址。因此在數組名作函數參數時所進行的傳送只是地址的傳送, 也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之后,也就等于有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。圖5.1說明了這種情形。圖中設a為實參數組,類型為整型。a占有以2000 為首地址的一塊內存區(qū)。b為形參數組名。當發(fā)生函數調用時,進行地址傳送, 把實參數 組a的首地址傳送給形參數組名b,于是b也取得該地址2000. 于是a,b兩數組共同占有以2000 為首地址的一段連續(xù)內存單元。從圖中還可以看出a和b下標相同的元素實際上也占相同的兩個內存單元(整型數組每個元素占二字節(jié))。例如a[0]和b[0]都占用2000和2001單元,當然a[0]等于b[0].類推則有a[i]等于b[i]。
[例5.5]數組a中存放了一個學生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);
……
}
本程序首先定義了一個實型函數aver,有一個形參為實型數組a,長度為5。在函數aver中,把各元素值相加求出平均值,返回給主函數。主函數main 中首先完成數組sco的輸入,然后以sco作為實參調用aver函數,函數返回值送av,最后輸出av值。 從運行情況可以看出,程序實現了所要求的功能
相關推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |