zoukankan      html  css  js  c++  java
  • 指针引用的用法

    指针引用就是一个指针的引用,看下面例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);

    所以传指针引用的目的是要修改这个指针,调用函数之后修改这个指针的值,获得这个修改后的值以备他用。

    总结一下:传引用的目的一般是为了修改这个传递的是引用的参数,然后返回这个值(以后程序中会用到);或者是不让编译器对参数进行拷贝,提高效率。



  • 相关阅读:
    (模板)高斯消元法模板
    poj1797(dijstra变形,求最小边的最大值)
    poj2253(floyd变形)
    (模板)poj2387(dijkstra+优先队列优化模板题)
    poj1915(双向bfs)
    poj3977(折半枚举+二分查找)
    uva11624 Fire! (bfs预处理)
    codeforces#1152C. Neko does Maths(最小公倍数)
    codeforces#1154F. Shovels Shop (dp)
    codeforces#1136E. Nastya Hasn't Written a Legend(二分+线段树)
  • 原文地址:https://www.cnblogs.com/kex1n/p/2286546.html
Copyright © 2011-2022 走看看