天天看點

指針引用的用法

指針引用就是一個指針的引用,看下面例1:

int a = 10;

int b = 20;

void swap(int& lhs, int& rhs)

{

      int tmp = lhs;

      lhs = rhs;

      rhs = tmp;

swap(a, b);

上面的程式可以成功交換兩個int值,但是如果形參傳的是int而非其引用的話則不會交換2個int值,因為形參非引用的情況下,編譯器會複制a,b然後把a,b的拷貝傳到swap函數中,交換的隻是a,b的拷貝而已,是以失敗。但是傳引用則可以成功。

例2:

    /* 查找機車

     * @name:   機車名字

     * @crg:    被查找到的機車

     * @return: 未找到機車傳回false;否則傳回true

    */

    bool find(LPCTSTR name, Carriage* &crg);

bool CRG_Repository::find(LPCTSTR name, Carriage *&crg)

    for (size_t i=0;i<crgs_.size();i++)

    {

        if (name==crgs_[i]->name())

        {

            crg=crgs_[i];

            return true;

        }

    }

    return true;

}

上面程式根據name查找機車,其中機車存放在一個容器中:std::deque<Carriage *> crgs_

并傳回找到的這個機車的指針。

如果find函數的第二個參數不傳指針的引用而傳指針的話,可能如下所示:

Carriage* found;

CRG_Repository crep;

crep.find("123", found);

這樣的調用不會改變found這個指針的值,find函數僅僅改變了found的拷貝而已,是以失敗。

當傳指針引用的時候則會成功,因為:傳引用編譯器不會拷貝一個found傳到find函數中去,而是直接傳遞found,在find函數内部的修改就是found本身,而不是它的拷貝;修改完後,found的值變了,當然可以成功。

當然這個find函數也可以這樣

Carriage* find(LPCTSTR name);

是以傳指針引用的目的是要修改這個指針,調用函數之後修改這個指針的值,獲得這個修改後的值以備他用。

總結一下:傳引用的目的一般是為了修改這個傳遞的是引用的參數,然後傳回這個值(以後程式中會用到);或者是不讓編譯器對參數進行拷貝,提高效率。

上一篇: 引用和指針
下一篇: 指針和引用