天天看點

C語言數組名作為函數參數

http://c.biancheng.net/cpp/html/61.html

1) 用數組元素作實參時,隻要數組類型和函數的形參變量的類型一緻,那麼作為下标變量的數組元素的類型也和函數形參變量的類型是一緻的。是以,并不要求函數的形參也是下标變量。換句話說,對數組元素的處理是按普通變量對待的。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明确的數組說明。當形參和實參二者不一緻時,即會發生錯誤。

2) 在普通變量或下标變量作函數參數時,形參變量和實參變量是由編譯系統配置設定的兩個不同的記憶體單元。在函數調用時發生的值傳送是把實參變量的值賦予形參變量。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組并不存在,編譯系統不為形參數組配置設定記憶體。那麼,資料的傳送是如何實作的呢?在我們曾介紹過,數組名就是數組的首位址。是以在數組名作函數參數時所進行的傳送隻是位址的傳送,也就是說把實參數組的首位址賦予形參數組名。形參數組名取得該首位址之後,也就等于有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段記憶體空間。

C語言數組名作為函數參數

上圖說明了這種情形。圖中設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]。

3) 前面已經讨論過,在變量作函數參數時,所進行的值傳送是單向的。即隻能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參并不變化,兩者的終值是不同的。而當用數組名作函數參數時,情況則不同。由于實際上形參和實參為同一數組,是以當形參數組發生變化時,實參數組也随之變化。當然這種情況不能了解為發生了“雙向”的值傳遞。但從實際情況來看,調用函數之後實參數組的值将由于形參數組值的變化而變化。

用數組名作為函數參數時還應注意以下幾點:

  1. 形參數組和實參數組的類型必須一緻,否則将引起錯誤。
  2. 形參數組和實參數組的長度可以不相同,因為在調用時,隻傳送首位址而不檢查形參數組的長度。當形參數組的長度與實參數組不一緻時,雖不至于出現文法錯誤(編譯能通過),但程式執行結果将與實際不符,這是應予以注意的。