C語言中文網 目錄

數組名作為函數參數傳遞,C語言數組作為函數參數傳遞詳解

本節開始,先問大家一個問題:“要確定一個一維數組需要知道哪些信息?”一個是數組的首地址,另一個是數組的長度。這樣就可以唯一地確定一個一維數組。因為數組是連續存放的,只要知道數組的首地址和數組的長度就能找到這個數組中所有的元素。

因此,要想通過實參和形參將一個數組從主調函數傳到被調函數,那么只需要傳遞這兩個信息即可。對于一維數組來說,其數組名就表示一維數組的首地址。所以只需要傳遞數組名和數組長度這兩個參數就可以將數組從主調函數傳入被調函數中。

當數組名作為函數的實參時,形參列表中也應定義相應的數組(或用指針變量),且定義數組的類型必須與實參數組的類型一致,如果不一致就會出錯。但形參中定義的數組無須指定數組的長度,而是再定義一個參數用于傳遞數組的長度。所以在傳遞實參的時候,數組名和數組長度也只能用兩個參數分開傳遞,而不能寫在一起。因為即使寫在一起,系統在編譯時也只是檢查數組名,并不會檢查數組長度。所以數組長度要額外定義一個變量進行傳遞。

綜上所述,當將數組從一個函數傳到另一個函數中時,并不是將數組中所有的元素一個一個傳過來(那樣效率就太低了)。而是將能夠唯一確定一個數組的信息傳過來,即數組名(數組首地址)和數組長度。此時主調函數和被調函數操作的就是同一個數組。

下面來寫一個程序:
# include <stdio.h>
int AddArray(int array[], int n);  //函數聲明
int main(void)
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
    int size = sizeof(a) / sizeof(a[0]);  /*數組所占內存總大小除以該數組中一個元素所占內存的大小, 從而得到數組元素的個數*/
    printf("sum = %d\n", AddArray(a, size));
    return 0;
}
int AddArray(int array[], int n)  //形參數組中不需要寫長度
{
    int i, sum = 0;
    for (i=0; i<n; ++i)
    {
        sum += array[i];
    }
    return sum;
}
輸出結果是:
sum = 36

再問大家一個問題:“前面講過,當對數組名使用 sizeof 時可以求出整個數組在內存中所占的字節數。那么上面這個程序中,對被調函數 AddArray 中的數組 array 使用 sizeof 得到的值會是多少?”

有人會說,實參數組 a 占 32 字節,實參 a 傳給形參 array,所以 array 也占 32 字節。但實際上,array 只占 4 字節。下面寫一個程序看一下:
# include <stdio.h>
int AddArray(int array[]);  //函數聲明
int main(void)
{
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8};
    AddArray(a);
    return 0;
}
int AddArray(int array[])
{
    printf("sizeof(array) = %d\n", sizeof(array));
    return 0;
}
輸出結果是:
sizeof(array) = 4

因為數組名做函數參數時,只是將實參數組的“首地址”傳給了形參數組。此時被調函數 AddArray 中的數組 array 本質上是一個指針變量,里面存放的是主調函數中數組 a 的地址。指針變量也是一個變量類型。不同于前面所講的其他變量類型,指針變量里面存放的不是一般的數據,而是地址。在 C 語言中,指針變量所占的字節數都是 4。所以對 array 使用 sizeof 求出的就是 4(但有些顯示求出的可能是 8,這跟操作系統有關)。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo