1. 程式人生 > >指標和引用作為函式傳遞引數

指標和引用作為函式傳遞引數

引用傳遞

  1. void OutputNumber(int &nNumber) //設定引用型別引數 
  2. {  
  3.     cout << nNumber << endl;                            //輸出結果 
  4.     nNumber = 20;                                   //修改引數值,將影響到實際引數 
  5. }  
  6. int main(int argc, char* argv[])  
  7. {  
  8. int nNum = 10;                                  //定義一個變數 
  9.     OutputNumber(nNum); 
    //呼叫OutputNumber函式 
  10.     cout << nNum << endl;   //輸出變數值 
  11. return 0;  

指標傳遞

  1. void OutputNumber(int *pNumber) //使用指標作為函式引數 
  2. {     
  3.     cout << *pNumber << endl;      //輸出引數值 
  4.     *pNumber = 20;                  //設定引數值 
  5. }  
  6. int main(int argc, char* argv[])  
  7. {  
  8. int nNum = 10;      //定義一個整型變數
     
  9.     OutputNumber(&nNum);    //呼叫OutputNumber函式 
  10.     cout << nNum << endl;   //輸出nNum 
  11. return 0;  

輸出結果是一樣的:10 20

在編寫函式時,如果函式需要採用引用方式傳遞,使用指標和引用作為引數型別都是可以的。使用指標和引用型別作為函式引數各有優缺點,視具體環境而定。對於引用型別,引用必須被初始化為一個物件,並且不能使它再指向其他物件,因為對引用賦值實際上是對目標物件賦值。這是引用型別的缺點,但也是引用型別的優點,因為在函式呼叫時需要驗證引用引數的合法性。例如,如果函式OutputNumber採用引用引數型別,則語句"OutputNumber(0);"是非法的。如果函式OutputNumber採用指標型別引數,則語句"OutputNumber(0);"是合法的。因為0被認為是一個空指標,對空指標操作必然會導致地址訪問錯誤。因此對於指標物件作為函式引數,函式體中需要驗證指標引數是否為空。這

是使用指標型別作為函式引數的缺點。但是,使用指標物件作為函式引數,使用者可以隨意修改指標引數指向的物件,這是引用型別引數所不能的。另外的區別就是上面的呼叫時用法的區別了了。引用時只需要傳遞值就行,但是指標的話需要傳遞地址。