1. 程式人生 > >按值傳遞、按指標傳遞、按引用傳遞的區別

按值傳遞、按指標傳遞、按引用傳遞的區別

  • 值傳遞
      形參是實參的拷貝(會在棧記憶體中建立形參並拷貝實參的值),函式執行完畢後會自動清除棧記憶體。所以從被呼叫函式的角度來說,值傳遞是單向的,形參不能改變實參。當內部函式不需要改變實參則採用值傳遞。

  • 指標傳遞
     指標傳遞引數的本質是值傳遞,只不過它傳遞的是一個地址值,函式執行的時候在棧中建立並拷貝實參的地址值。函式可以根據地址,找到地址指向的記憶體單元。因而可以改變主函式實參指向的變數的值。
    如果要資料物件是陣列,則只能使用指標。因為值傳遞不能直接陣列,引用的物件也不能是陣列。

  • 引用傳遞
      &表示引用實參,即代表形參是實參的一個別名。操作引用變數就是操作實參變數。這是C++語法寫法,標準C是不支援這種寫法的。

  在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的地址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的地址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

  • 引用和指標的區別:
    指標指向一塊記憶體,它的內容是所指記憶體的地址;而引用則是某塊記憶體的別名,引用初始化後不能改變指向(引用必須在建立的時候初始化)。使用時,引用更加安全,指標更加靈活。但是就效率和佔用記憶體的來說,指標和應用是差不多的。

使用背景

  • 對於使用傳遞的值二不作修改的函式
  1. 如果資料物件小,如內建資料型別或小型結構,則按值傳遞;
  2. 如果資料物件是陣列,則使用指標,因為這是唯一的選擇,並將指標宣告為指向const的指標;
  3. 如果資料物件是較大的結構,則使用const指標或const引用,以提高程式的效率。這樣可以節省複製結構所需的時間和空間。
  4. 如果資料物件是類物件,則使用const引用。類設計的語義常常要求使用引用,這是c++新增這項特性的主要原因。因此,傳遞類物件引數的標準方式是按引用傳遞。
  • 對於修改呼叫函式中資料的函式
  1. 如果資料物件是陣列,則只能使用指標。
  2. 如果資料兌現是結構,則使用指標或應用。
  3. 資料物件是類物件,則使用引用。