前面講到了巧用引用形參可以達到很好地目的。還有一種是指針形參,它用的比較少,專用于數組形參。
問:什麼時候應使用指針形參?什麼時候應使用引用形參?兩者的優缺點是什麼?
- 使用的情況
當函數需要處理數組,且函數體不依賴于數組的長度時應使用指針形參,其他情況下用引用形參。
- 優缺點
指針形參的優點是可以明确表示函數所操縱的是指向數組元素的指針,而不是數組本身,而且可以用任意長度的實參數組來調用函數;缺點是函數體不能依賴于數組的長度,容易造成數組記憶體的越界通路,進而産生錯誤的結果或導緻程式的崩潰。
void printValues(int*){...}
void printValues(int[]){...}
void printValues(int[]){...}
上面三種定義是等價的,形參類型都是int*,即使寫的是數組,預設轉化成了指向數組的指針。
實參可以是任意長度的int 型數組,但是使用過程中可能會越界,不安全。
引用形參的優點是在函數體中以來數組的長度,是安全的;其缺點是限制了可以傳遞的實參數組,隻能使用長度比對的實參數組來調用函數。
void printValues(int (&arr)[]){...}
這是引用形參,引用含有10個 int 型元素的數組,實參隻能含有10個int 型資料。
PS: &arr 兩邊的圓括号是必需的!!!因為下标操作符具有更高的優先級:
f(int &arr[]) //arr是一個數組,該數組含有是個均為int型引用的資料
f(int (&arr)[10]) //arr是一個數組的引用,該數組含有是個int型資料
是以,在用函數處理數組的時候,要多加小心。。。