數組引用:C++ 數組做參數 深入分析


轉載:https://blog.csdn.net/jiangxinyu/article/details/7767065

 

在 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風格字符串是字符的數組,它用一個空字符編碼作為結尾。但是所有其他類型,包括希望處理內含空字符的字符數組必須以某種方式在向函數傳遞實參時使其知道它的長度。

 

一種常見的機制是提供一個含有數組長度的額外參數。例如:
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; 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM