數組能夠做爲函數的參數使用,進行數據傳送。
數組用做函數參數有兩種形式,一種是把數組元素(下標變量)做爲實參使用;另外一種是把數組名做爲函數的形參和實參使用。編程
數組元素就是下標變量,它與普通變量並沒有區別。 所以它做爲函數實參使用與普通變量是徹底相同的,在發生函數調用時,把做爲實參的數組元素的值傳送給形參,實現單向的值傳送。【例5-4】說明了這種狀況。
【例8-7】判別一個整數數組中各元素的值,若大於0 則輸出該值,若小於等於0則輸出0值。編程以下:數組
本程序中首先定義一個無返回值函數nzp,並說明其形參v爲整型變量。在函數體中根據v值輸出相應的結果。在main函數中用一個for語句輸入數組各元素,每輸入一個就以該元素做實參調用一次nzp函數,即把a[i]的值傳送給形參v,供nzp函數使用。函數
用數組名做函數參數與用數組元素做實參有幾點不一樣。
1) 用數組元素做實參時,只要數組類型和函數的形參變量的類型一致,那麼做爲下標變量的數組元素的類型也和函數形參變量的類型是一致的。所以,並不要求函數的形參也是下標變量。換句話說,對數組元素的處理是按普通變量對待的。用數組名做函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。當形參和實參兩者不一致時,即會發生錯誤。
2) 在普通變量或下標變量做函數參數時,形參變量和實參變量是由編譯系統分配的兩個不一樣的內存單元。在函數調用時發生的值傳送是把實參變量的值賦予形參變量。在用數組名做函數參數時,不是進行值的傳送,即不是把實參數組的每個元素的值都賦予形參數組的各個元素。由於實際上形參數組並不存在,編譯系統不爲形參數組分配內存。那麼,數據的傳送是如何實現的呢?在咱們曾介紹過,數組名就是數組的首地址。所以在數組名做函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址以後,也就等於有了實在的數組。其實是形參數組和實參數組爲同一數組,共同擁有一段內存空間。
上圖說明了這種情形。圖中設a爲實參數組,類型爲整型。a佔有以2000爲首地址的一塊內存區。b爲形參數組名。當發生函數調用時,進行地址傳送,把實參數組a的首地址傳送給形參數組名b,因而b也取得該地址2000。因而a,b兩數組共同佔有以2000爲首地址的一段連續內存單元。從圖中還能夠看出a和b下標相同的元素實際上也佔相同的兩個內存單元(整型數組每一個元素佔二字節)。例如a[0]和b[0]都佔用2000和2001單元,固然a[0]等於b[0]。類推則有a[i]等於b[i]。
【例8-8】數組a中存放了一個學生5門課程的成績,求平均成績。spa
本程序首先定義了一個實型函數aver,有一個形參爲實型數組a,長度爲5。在函數aver中,把各元素值相加求出平均值,返回給主函數。主函數main 中首先完成數組sco的輸入,而後以sco做爲實參調用aver函數,函數返回值送av,最後輸出av值。 從運行狀況能夠看出,程序實現了所要求的功能。
3) 前面已經討論過,在變量做函數參數時,所進行的值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參並不變化,二者的終值是不一樣的。而當用數組名做函數參數時,狀況則不一樣。因爲實際上形參和實參爲同一數組,所以當形參數組發生變化時,實參數組也隨之變化。固然這種狀況不能理解爲發生了「雙向」的值傳遞。但從實際狀況來看,調用函數以後實參數組的值將因爲形參數組值的變化而變化。爲了說明這種狀況,把【例5.4】改成【例5.6】的形式。
【例8-9】題目同【例8.7】。改用數組名做函數參數。blog
本程序中函數nzp的形參爲整數組a,長度爲5。主函數中實參數組b也爲整型,長度也爲5。在主函數中首先輸入數組b的值,而後輸出數組b的初始值。而後以數組名b爲實參調用nzp函數。在nzp中,按要求把負值單元清0,並輸出形參數組a的值。 返回主函數以後,再次輸出數組b的值。從運行結果能夠看出,數組b的初值和終值是不一樣的,數組b的終值和數組a是相同的。這說明實參形參爲同一數組,它們的值同時得以改變。
用數組名做爲函數參數時還應注意如下幾點:
①形參數組和實參數組的類型必須一致,不然將引發錯誤。
②形參數組和實參數組的長度能夠不相同,由於在調用時,只傳送首地址而不檢查形參數組的長度。當形參數組的長度與實參數組不一致時,雖不至於出現語法錯誤(編譯能經過),但程序執行結果將與實際不符,這是應予以注意的。
【例8.10】如把例8.9修改以下:ip
本程序與【例8.9】程序比,nzp函數的形參數組長度改成8,函數體中,for語句的循環條件也改成i<8。所以,形參數組a和實參數組b的長度不一致。編譯可以經過,但從結果看,數組a的元素a[5]、a[6]、a[7]顯然是無心義的。
③在函數形參表中,容許不給出形參數組的長度,或用一個變量來表示數組元素的個數。例如,能夠寫爲:
void nzp(int a[])
或寫爲
void nzp( int a[], int n )
其中形參數組a沒有給出長度,而由n值動態地表示數組的長度。n的值由主調函數的實參進行傳送。由此,【例8-10】又可改成【例8-11】的形式。
【例8-11】內存
本程序nzp函數形參數組a沒有給出長度,由n 動態肯定該長度。在main函數中,函數調用語句爲nzp(b,5),其中實參5將賦予形參n做爲形參數組的長度。
④多維數組也能夠做爲函數的參數。在函數定義時對形參數組能夠指定每一維的長度,也可省去第一維的長度。所以,如下寫法都是合法的:
int MA(int a[3][10])
或
int MA(int a[][10])。ci