C語言技巧:怎樣把數組做爲參數傳遞給函數?

在把數組做爲參數傳遞給函數時,有值傳遞(by value)地址傳遞(by reference)兩種方式。在值傳遞方式中,在聲明定義函數時,要在數組參數的尾部加上一對方括號([]),調用函數時只需將數組的地址(即數組名)傳遞給函數。例如,在下例中數組x[]是經過值傳遞方式傳遞給byval_func()函數的:

數組

#include <stdio.h>
int byval_func(int []);       /* 
                               * The byval_func() function is passed an
                               * integer array by value.
                               */
int main (int argc, char *argv[])
{
    int x[10];
    int y;
     /* Set up the integer array. */
     for (y = 0 ; y < 10; y++)
        x[y] = y;
     /* Call byval_func() ,passing the x array by value. */
     byval_func(x);
     return 0;
}
/* The byval_function receives an integer array by value. */
int byval_func(int i[])
{
     int y;
     /* print the content: of the integer array. */
     for (y = 0; y < 10; y++)
     {
         printf("%d\n", i[y]);
     }
     return 0;
}

在上例中,定義了一個數組名爲x的數組,並對它的10個元素賦了初值。函數byval_func()的聲明以下所示:
int byval_func(int []);
參數int []告訴編譯程序byval_func()函數只有一個參數,即一個由int類型值組成的數組。在調用byval_func()函數時,只需將數組的地址傳遞給該函數,即:函數

byval_func(x);spa

在值傳遞方式中,數組x將被複制一份,複製所得的數組將被存放在棧中,而後由byval_func()函數接收並打印出來。因爲傳遞給byal_func()函數的是初始數組的一份拷貝,所以在byval_func()函數內部修改傳遞過來的數組對初始數組沒有任何影響。
值傳遞方式的開銷是很是大的,其緣由有這樣幾點:
第一,須要完整地複製初始數組並將這份拷貝存放到棧中,這將耗費至關可觀的運行時間,於是值傳遞方式的效率比較低;
第二,初始數組的拷貝須要佔用額外的內存空間(棧中的內存);
第三,編譯器須要專門產生一部分用來複製初始數組的代碼,這將使程序變大。

地址傳遞方式克服了值傳遞方式的缺點,是一種更好的方式。在地址傳遞方式中,傳遞給函數的是指向初始數組的指針,不用複製初始數組,所以程序變得精練和高效,而且也節省了棧中的內存空間。地址傳遞方式中,只需在函數原型中將函數的參數聲明爲指向數組元素數據類型的一個指針。請看下例:

指針

#include <stdio.h>
int const_func(const int *);
int main(int argc, char *argv[])
{
    int x[10];
    int y;
    /* Set up the integer array. */
    for (y = 0; y < 10; y++)
    {
        x[y] = y;
    }
    /* Call const_func(), passing the x array by reference. */
    const_func(x);
    return 0;
}
/*
 * The const_function receives an integer array by reference.
 * Notice that the pointer i » declared aa const, which renders
 * it unmodif table by the const_funcO function. 
 */
int const_func(const int *i)
{
    int y;
    /* print the contents of the integer array. */
    for (y = 0; y < 10; y++)
    {
        printf("%d\n", * (i + y));
    }
    return 0;
}

在上例中,一樣定義了一個名爲x的數組,並對它的10個元素賦了初始值。函數const_func()的聲明以下所示:
int const_func(const int *);
參數const int *告訴編譯器,const_func()函數只有一個參數,即指向一個int類型(基本整型)常量的指針。在調用const_func()函數時,一樣只需將數組的地址傳遞給該函數,即:const_rune(x);
在地址傳遞方式中,沒有複製初始數組並將其拷貝存放在棧中,const_rune()函數只接收到一個指向一個int類型(基本整型)常量的指針,所以在編寫程序時要保證傳遞給const_func()函數的是指向一個由int類型值組成的數組的指針。const修飾符的做用是防止const_func()函數意外地修改初始數組中的某一個元素。
地址傳遞方式惟一的不足之處是必須由程序自己來保證將一個數組傳遞給函數做爲參數,例如,在函數const—rune()的原型定義中,都沒有明確指示該函數的參數是指向一個由int類型值組成的數組的指針。然而,地址傳遞方式速度快,效率高,所以,在對運行速度要求比較高時,應該採用這種方式。
code

相關文章
相關標籤/搜索