數(shù)組可以作為函數(shù)的參數(shù)使用,,進行數(shù)據(jù)傳送,。 數(shù)組用作函數(shù)參數(shù)有兩種形式,一種是把數(shù)組元素(下標(biāo)變量)作為實參使用,;另一種是把數(shù)組名作為函數(shù)的形參和實參使用,。 數(shù)組元素作函數(shù)實參數(shù)組元素就是下標(biāo)變量,它與普通變量并無區(qū)別,。 因此它作為函數(shù)實參使用與普通變量是完全相同的,,在發(fā)生函數(shù)調(diào)用時,把作為實參的數(shù)組元素的值傳送給形參,,實現(xiàn)單向的值傳送,。【例5-4】說明了這種情況,。【例8-7】判別一個整數(shù)數(shù)組中各元素的值,,若大于0 則輸出該值,若小于等于0則輸出0值,。編程如下:
#include <stdio.h> void nzp(int v){ if(v>0) printf('%d ',v); else printf('%d ',0); } int main(void){ int a[5],i; printf('input 5 numbers\n'); for(i=0;i<5;i ){ scanf('%d',&a[i]); nzp(a[i]); } return 0; } 數(shù)組名作為函數(shù)參數(shù)用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作實參有幾點不同,。1) 用數(shù)組元素作實參時,只要數(shù)組類型和函數(shù)的形參變量的類型一致,,那么作為下標(biāo)變量的數(shù)組元素的類型也和函數(shù)形參變量的類型是一致的。因此,,并不要求函數(shù)的形參也是下標(biāo)變量,。換句話說,對數(shù)組元素的處理是按普通變量對待的,。用數(shù)組名作函數(shù)參數(shù)時,,則要求形參和相對應(yīng)的實參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明,。當(dāng)形參和實參二者不一致時,,即會發(fā)生錯誤。 2) 在普通變量或下標(biāo)變量作函數(shù)參數(shù)時,,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元,。在函數(shù)調(diào)用時發(fā)生的值傳送是把實參變量的值賦予形參變量。在用數(shù)組名作函數(shù)參數(shù)時,,不是進行值的傳送,,即不是把實參數(shù)組的每一個元素的值都賦予形參數(shù)組的各個元素。因為實際上形參數(shù)組并不存在,,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存,。那么,數(shù)據(jù)的傳送是如何實現(xiàn)的呢?在我們曾介紹過,,數(shù)組名就是數(shù)組的首地址,。因此在數(shù)組名作函數(shù)參數(shù)時所進行的傳送只是地址的傳送,也就是說把實參數(shù)組的首地址賦予形參數(shù)組名,。形參數(shù)組名取得該首地址之后,,也就等于有了實在的數(shù)組。實際上是形參數(shù)組和實參數(shù)組為同一數(shù)組,,共同擁有一段內(nèi)存空間,。 上圖說明了這種情形。圖中設(shè)a為實參數(shù)組,,類型為整型,。a占有以2000為首地址的一塊內(nèi)存區(qū)。b為形參數(shù)組名,。當(dāng)發(fā)生函數(shù)調(diào)用時,,進行地址傳送,把實參數(shù)組a的首地址傳送給形參數(shù)組名b,,于是b也取得該地址2000,。于是a,,b兩數(shù)組共同占有以2000為首地址的一段連續(xù)內(nèi)存單元。從圖中還可以看出a和b下標(biāo)相同的元素實際上也占相同的兩個內(nèi)存單元(整型數(shù)組每個元素占二字節(jié)),。例如a[0]和b[0]都占用2000和2001單元,,當(dāng)然a[0]等于b[0]。類推則有a[i]等于b[i],。 【例8-8】數(shù)組a中存放了一個學(xué)生5門課程的成績,,求平均成績。
#include <stdio.h> 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; } int main(void){ 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); return 0; } 3) 前面已經(jīng)討論過,,在變量作函數(shù)參數(shù)時,,所進行的值傳送是單向的。即只能從實參傳向形參,,不能從形參傳回實參,。形參的初值和實參相同,而形參的值發(fā)生改變后,,實參并不變化,,兩者的終值是不同的。而當(dāng)用數(shù)組名作函數(shù)參數(shù)時,,情況則不同,。由于實際上形參和實參為同一數(shù)組,因此當(dāng)形參數(shù)組發(fā)生變化時,,實參數(shù)組也隨之變化,。當(dāng)然這種情況不能理解為發(fā)生了“雙向”的值傳遞。但從實際情況來看,,調(diào)用函數(shù)之后實參數(shù)組的值將由于形參數(shù)組值的變化而變化,。為了說明這種情況,把【例5.4】改為【例5.6】的形式,。 【例8-9】題目同【例8.7】,。改用數(shù)組名作函數(shù)參數(shù),。
#include <stdio.h> 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]); } } int main(void){ 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]); return 0; } 用數(shù)組名作為函數(shù)參數(shù)時還應(yīng)注意以下幾點: ①形參數(shù)組和實參數(shù)組的類型必須一致,否則將引起錯誤,。 ②形參數(shù)組和實參數(shù)組的長度可以不相同,,因為在調(diào)用時,只傳送首地址而不檢查形參數(shù)組的長度,。當(dāng)形參數(shù)組的長度與實參數(shù)組不一致時,,雖不至于出現(xiàn)語法錯誤(編譯能通過),但程序執(zhí)行結(jié)果將與實際不符,,這是應(yīng)予以注意的,。 【例8.10】如把例8.9修改如下:
#include <stdio.h> 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]); } } int main(void){ 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]); return 0; } ③在函數(shù)形參表中,,允許不給出形參數(shù)組的長度,,或用一個變量來表示數(shù)組元素的個數(shù)。例如,,可以寫為: void nzp(int a[]) 或?qū)憺?br> void nzp( int a[], int n ) 其中形參數(shù)組a沒有給出長度,,而由n值動態(tài)地表示數(shù)組的長度。n的值由主調(diào)函數(shù)的實參進行傳送,。由此,,【例8-10】又可改為【例8-11】的形式。 【例8-11】
#include <stdio.h> void nzp(int a[],int n){ int i; printf('\nvalues of array a are:\n'); for(i=0;i<n;i ){ if(a[i]<0) a[i]=0; printf('%d ',a[i]); } } int main(void){ 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,5); printf('\nlast values of array b are:\n'); for(i=0;i<5;i ) printf('%d ',b[i]); return 0; } ④多維數(shù)組也可以作為函數(shù)的參數(shù),。在函數(shù)定義時對形參數(shù)組可以指定每一維的長度,,也可省去第一維的長度。因此,,以下寫法都是合法的: int MA(int a[3][10]) 或 int MA(int a[][10]),。 |
|