• C++引用的概念


    引用是什么?

    引用不是新定义的一个变量,而是给已经存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间.
    比如孙悟空,尊重它的时候叫他齐天大圣,不尊重他的时候叫他弼马温,《西游记》孙悟空对战金角、银角大王那一回,它还给自己取了很多别名:孙行者、行者孙、者行孙其实都是一个人。

    在这里插入图片描述

    引用的别名

    在这里插入图片描述
    在这里插入图片描述
    从上面调试我们可以看出,一个变量可以有多个别名,从存储的角度来讲,先是给变量a开了4个字节的存储空间,空间里面放了一个10,此时a的值就是10。ra又是a的别名,x又是a的别名,y又是x的别名,所以它们存的值是相等的,3次加加后就变成了13,地址也是指向同一块内存空间的。

    引用的传参

    在这里插入图片描述
    m是cc的别名,dd的别名又是n,所以m和n的交换就是cc和dd的交换,这就是利用了一个引用的传参,就不用传地址那么麻烦了!
    比如大家在用二级指针的时候能更好地体现它的一个价值,改变一个实参传它的指针,要想改变指针就得传二级指针,我们用引用的话就会方便很多,直接给指针变量取个别名,就不用传二级指针了!

    指针和引用的区别

    1、两者的定义和性质不同
    在这里插入图片描述
    上面定义了一个整型变量 a,p 是一个指针变量,p 的值是变量 a 的地址;
    而引用 r,是 a 的一个别名,在内存中 r 和 a 占有同一个存储单元。

    2、指针可以有多级,引用只能是一级
    在这里插入图片描述

    3、指针可以在定义的时候不初始化,引用必须在定义的时候初始化
    在这里插入图片描述

    4、指针可以指向NULL,引用不可以为NULL
    在这里插入图片描述

    5、指针初始化之后可以再改变,引用不可以
    在这里插入图片描述

    6、sizeof 的运算结果不同
    在这里插入图片描述

    7、自增运算意义不同
    在这里插入图片描述
    如上图所示,p++之后指向a后面的内存,r++相当于a++。

    8、指针和引用作为函数参数时,指针需要检查是否为空,引用不需要
    在这里插入图片描述
    指针需要检查,引用不需要,但指针和引用都可以作为函数参数,改变实参的值。因此,引用的定义是:引用初始化以后不能被改变”不是指变量的值不可变,而是指向的变量地址不可变。

    引用的特性

    1.引用在定义时必须初始化
    2.一个变量可以有多个引用
    前两个特性上面已经说的很清楚了,所以这里就不做介绍了。
    3.引用一但引用一个实体,再不能引用其他实体
    在这里插入图片描述
    在这里插入图片描述
    通过调试我们看到a和它的别名ra指向的是同一个内存空间,ra的改变就是对a的改变,但b是指向另一个内存空间,所以b是赋值。

    常引用

    含义:常引用是指利用 const 修饰的引用类型。 由于引用本身已经绑定不可解绑,因此所用的 const 引用都是底层 const,即引用对象不能改变 (俗称常引用)。

    使用场景

    1.做参数

    void swap(int& left,int& right)
    {
    int temp=left;
    left=right;
    right=temp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    做参数直接使用。
    2.做返回值

    int& count()
    {
    static int n=0;
    n++;
    return n;
    }
    int main()
    {
    int ret=count();
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    做返回值不是把这个n做返回值,中间会产生一个临时变量,返回的是临时变量,这个临时变量就是n的别名,如果是函数调用的话n生成的临时变量就会被销毁,如果去访问就会出现野指针的问题,就不能用引用返回,出了作用域,返回变量存在才能引用返回。所以我们要加static保护起来,延长生命周期,使存储在静态区的数据生命周期与程序相同。

    引用返回的意义

    1.减少拷贝,提高效率
    2.修改返回值

  • 相关阅读:
    【leetcode学习计划】算法入门(1 / 14)
    Nginx 简单介绍(一)
    使用 Keras 和 TensorFlow Lite 的设备端大型语言模型
    ftp命令大全详解
    【LeetCode高频100题】1 - ?
    Windows电脑部署Jellyfin服务端并进行远程访问配置详细教程
    【微服务|Nacos】Nacos版本相关问题一览
    C# 之委托和事件
    JVS规则引擎,打造智能自动化决策的利器
    vue中不同情况下的通讯方式
  • 原文地址:https://blog.csdn.net/m0_69787428/article/details/126898853