在 C++中,數組永遠不會按值傳遞,它是傳遞第一個元素,準確地說是第 0個 的指標。
例如,如下聲明 :
void putValues( int[ 10 ] );
被編譯器視為
void putValues( int* );
數組的長度與參數聲明無關,因此,下列三個聲明是等價的:
// 三個等價的 putValues()聲明
void putValues( int* );
void putValues( int[] );
void putValues( int[ 10 ] );
因為數組被傳遞為指標 所以這對程式員有兩個含義:
1. 在被調函數內對參數數組的改變將被應用到數組實參上而不是本地拷貝上,當用作實參的數組必須保持不變時,程式員需要保留原始數組的拷貝函數可以通過把參數型別宣告為 const 來表明不希望改變數組元素。
void putValues( const int[ 10 ] );
2. 數組長度不是參數類型的一部分,函數不知道傳遞給它的數組的實際長度,編澤器也不知道,當編譯器對實參類型進行參數類型檢查時,並不檢查數組的長度。例如:
void putValues( int[ 10 ] ); // 視為 int*
int main() {
int i, j[ 2 ];
putValues( &i ); // ok: &i 是 int*; 潛在的運行錯誤
putValues( j ); // ok: j 被轉換成第 0 個元素的指標
// 實參類型為 int*: 潛在的運行錯誤
return 0;
}
參數的類型檢查只能保證putValues()的兩次調用都提供了int*型的實參,類型檢查不能檢驗實參是一個 10元素的數組 。習慣上, C風格字串是字元的數組,它用一個Null 字元編碼作為結尾。但是所有其他類型,包括希望處理內含Null 字元的字元數組必須以某種方式在向函數傳遞實參時使其知道它的長度。
一種常見的機制是提供一個含有數組長度的額外參數。例如:
void putValues( int[], int size );
int main() {
int i, j[ 2 ];
putValues( &i, 1 );
putValues( j, 2 );
return 0;
}
另外一種機制是將參數聲明為數組的引用
當參數是一個數群組類型的引用時,數組長度成為參數和實參類型的一部分,編譯器檢查數組實參的長度與在函數參數類型中指定的長度是否匹配。
// 參數為 10 個 int 的數組
// parameter is a reference to an array of 10 ints
void putValues( int (&arr)[10] ); //不能寫成&arr[10],因為下標操作符的優先順序較高
int main() {
int i, j[ 2 ];
putValues( i ); // 錯誤: 實參不是 10 個 int 的數組
putValues( j ); // 錯誤: 實參不是 10 個 int 的數組
return 0;
}