引用和指針的區別

在c++函數中,形式參數用 引用 和用 指針都可以起到在被調用函數中改變調用函數的變量的作用。什麼時候用引用作參數什麼時候用指針作參數呢 void function (int *ptr); void function(int &ref); 
    沒有 特定的規定。。 學的 久了,就 會習慣什麼時候用指針什麼時候用引用了 引用與指針有什麼區別? 1) 引用必須被初始化,指針不必。 2) 引用初始化以後不能被改變,指針可以改變所指的對象。 2) 不存在指向空值的引用,但是存在指向空值的指針。 
    C++中儘量用引用。 個人覺得所有的引用都可以用指針,但指針比引用容易出錯。 
    引用當然更直觀更直接,做參數時,如果在函數內不刻意要用指針的那些副作用(如越界訪問,動態定向什麼的),引用可以代替指針。 
    C++ 中一般都用引用就可以了 ... C 中沒有引用,就使用指針 .... 
    舉例如下: 1 使用指針傳遞參數時: void function (int *ptr) { 函數體;} 調用該函數時 main() { int p; function (&p); } 2 使用引用傳遞參數時: void function(int &ref) { 函數體;} 調用該函數時 main() { int p; function (p); } 由此可見,使用引用比使用指針傳遞參數函數調用時更簡單,引用和指針功能大體相同,但是有空間分配時建議最好使用指針,因爲在釋放空間時,對指針只需要delete就行了,而引用是不能刪除空間的,引用必須指向一個存在的對象。 
    指針和引用的差別 1. 非空的差別任何情況下都不能使用指向空值的引用.一個引用必須總是指向某個對象. 不存在的指向空值的引用這個事實意味着使用引用的代碼效率比使用指針要高. 2. 合法性區別在使用引用之前不需要測試他的合法性.指針必須測試. 3. 可修改區別 指針可以被重新賦值給另一個不同的對象.但是引用總是指向在初始化的時候被制定的對象,以後不能改變.但是指定的對象其內容可以改變. 應該使用指針的情況: 可能存在不指向任何對象的可能性 需要在不同的時刻指向不同的對象(此時,你能夠改變指針的指向) 應該使用引用的情況: 如果總是指向一個對象並且一旦指向一個對象後就不會改變指向,使用此時應使用引用。 
    要首先好好理解指針和引用的區別 
    指針與引用看上去完全不同(指針用操作符’*’和’->’,引用使用操作符’.’),但是它們似乎有相同的功能。指針與引用都是讓你間接引用其他對象。你如何決定在什麼時候使用指針,在什麼時候使用引用呢? 

  首先,要認識到在任何情況下都不能用指向空值的引用。一個引用必須總是指向某些對象。因此如果你使用一個變量並讓它指向一個對象,但是該變量在某些時候也可能不指向任何對象,這時你應該把變量聲明爲指針,因爲這樣你可以賦空值給該變量。相反,如果變量肯定指向一個對象,例如你的設計不允許變量爲空,這時你就可以把變量聲明爲引用。 [Page]

  “但是,請等一下”,你懷疑地問,“這樣的代碼會產生什麼樣的後果?” 

  char *pc = 0; // 設置指針爲空值 

  char& rc = *pc; // 讓引用指向空值 

  這是非常有害的,毫無疑問。結果將是不確定的(編譯器能產生一些輸出,導致任何事情都有可能發生),應該躲開寫出這樣代碼的人除非他們同意改正錯誤。如果你擔心這樣的代碼會出現在你的軟件裏,那麼你最好完全避免使用引用,要不然就去讓更優秀的程序員去做。我們以後將忽略一個引用指向空值的可能性。 

  因爲引用肯定會指向一個對象,在C裏,引用應被初始化。 

  string& rs; // 錯誤,引用必須被初始化 
  string s(/"xyzzy/"); 
  string& rs = s; // 正確,rs指向s 

  指針沒有這樣的限制。 
  string *ps; // 未初始化的指針 
            // 合法但危險 

  不存在指向空值的引用這個事實意味着使用引用的代碼效率比使用指針的要高。因爲在使用引用之前不需要測試它的合法性。 

  void printDouble(const double& rd) 
  { 
   cout << rd; // 不需要測試rd,它 
  }       // 肯定指向一個double值 

  相反,指針則應該總是被測試,防止其爲空: 

  void printDouble(const double *pd) 
  { 
   if (pd) 
   {// 檢查是否爲NULL 
    cout << *pd; 
   } 
  } 

  指針與引用的另一個重要的不同是指針可以被重新賦值以指向另一個不同的對象。但是引用則總是指向在初始化時被指定的對象,以後不能改變。 

  string s1(/"Nancy/"); 
  string s2(/"Clancy/"); 

    string& rs = s1; // rs 引用 s1 
  string *ps = &s1; // ps 指向 s1 
  rs = s2; // rs 仍舊引用s1 
          // 但是 s1的值現在是/"Clancy/" 

    ps = &s2; // ps 現在指向 s2;// s1 沒有改變 

  總的來說,在以下情況下你應該使用指針,一是你考慮到存在不指向任何對象的可能(在這種情況下,你能夠設置指針爲空),二是你需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指針的指向)。如果總是指向一個對象並且一旦指向一個對象後就不會改變指向,那麼你應該使用引用。

[NextPage]

 還有一種情況,就是當你重載某個操作符時,你應該使用引用。最普通的例子是操作符[]。這個操作符典型的用法是返回一個目標對象,其能被賦值。 

  vector<int> v(10); //建立整形向量(vector),大小爲10 
                    //向量是一個在標準C庫中的一個模板 [Page]
  v[5] = 10; // 這個被賦值的目標對象就是操作符[]返回的值 

  如果操作符[]返回一個指針,那麼後一個語句就得這樣寫: 

  *v[5] = 10; 

  但是這樣會使得v看上去象是一個向量指針。因此你會選擇讓操作符返回一個引用 
  當你知道你必須指向一個對象並且不想改變其指向時,或者在重載操作符併爲防止不必要的語義誤解時,你不應該使用指針。而在除此之外的其他情況下,則應使用指針 。 
  
指針與引用看上去完全不同(指針用操作符“*”和“->”,引用使用操作符“. ”) 

發佈了6 篇原創文章 · 獲贊 2 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章