轉載自
http://c.biancheng.net/cpp/html/1595.html
在把數組作為參數傳遞給函數時,有值傳遞(by value)和地址傳遞(by reference)兩種方式。在值傳遞方式中,在說明和定義函數時,要在數組參數的尾部加上一對方括號([]),調用函數時只需將數組的地址(即數組名)傳遞給函數。例如,在下例中數組x[]是通過值傳遞方式傳遞給byval_func()函數的:
# include <atdio.h>
voidbyval_func(int[]); /*the byval_func() function is passed an
integer array by value * /
void main (void);
void main (void)
{
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);
}
/* The byval_function receives an integer array by value. * /
void byval_func(int i[])
{
int y;
/* print the content: of the integer array. * /
for (y=0; y<10; y++)
printf("%d\n", i[y]);
}
在上例中,定義了一個名為x的數組,並對它的10個元素賦了初值。函數byval_func()的說明如下所示:
intbyval_func(int []);
參數int[]告訴編譯程序byval_func()函數只有一個參數,即一個由int類型值組成的數組。在調用byval_func()函數時,只需將數組的地址傳遞給該函數,即:
byval_func(x);
在值傳遞方式中,數組x將被復制一份,復制所得的數組將被存放在棧中,然后由byval_func()函數接收並打印出來。由於傳遞給byal_func()函數的是初始數組的一份拷貝,因此在byval_func()函數內部修改傳遞過來的數組對初始數組沒有任何影響。
值傳遞方式的開銷是非常大的,其原因有這樣幾點:
第一,需要完整地復制初始數組並將這份拷貝存放到棧中,這將耗費相當可觀的運行時間,因而值傳遞方式的效率比較低;
第二,初始數組的拷貝需要占用額外的內存空間(棧中的內存);
第三,編譯程序需要專門產生一部分用來復制初始數組的代碼,這將使程序變大。
地址傳遞方式克服了值傳遞方式的缺點,是一種更好的方式。在地址傳遞方式中,傳遞給函數的是指向初始數組的指針,不用復制初始數組,因此程序變得精練和高效,並且也節省了棧中的內存空間。在地址傳遞方式中,只需在函數原型中將函數的參數說明為指向數組元素數據類型的一個指針。請看下例:
# include <atdio. h>
void conat_func(const int* );
void main (void);
void main(void)
{
int x[10];
int y;
/* Set up the integer array. * /
for (y=0; y<10; y++)
x[y] = y;
/* Call conat_func(), passing the x array by reference. */
conat_func(x);
}
/*The const_function receives an integer array by reference.
Notice that the pointer i» declared aa const, which renders
it unmodif table by the conat_funcO function. * /
void 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));
}
在上例中,同樣定義了一個名為x的數組,並對它的10個元素賦了初始值。函數const_func()的說明如下所示:
int const_func(const int·);
參數constint·告訴編譯程序const_func()函數只有一個參數,即指向一個int類型常量的指針。在調用const_func()函數時,同樣只需將數組的地址傳遞給該函數,即:
const_func(x);
在地址傳遞方式中,沒有復制初始數組並將其拷貝存放在棧中,const_func()函數只接收到指向一個int類型常量的指針,因此在編寫程序時要保證傳遞給const_func()函數的是指向一個由int類型值組成的數組的指針。const修飾符的作用是防止const_func()函數意外地修改初始數組中的某一個元素。
地址傳遞方式唯一的不足之處是必須由程序本身來保證將一個數組傳遞給函數作為參數,例如,在函數const_func()的原型和定義中,都沒有明確指示該函數的參數是指向一個由int類型值組成的數組的指針。然而,地址傳遞方式速度快,效率高,因此,在對運行速度要求比較高時,應該采用這種方式。