引用是什么?
引用不是新定义的一个变量,而是给已经存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间.
比如孙悟空,尊重它的时候叫他齐天大圣,不尊重他的时候叫他弼马温,《西游记》孙悟空对战金角、银角大王那一回,它还给自己取了很多别名:孙行者、行者孙、者行孙其实都是一个人。
引用的别名
从上面调试我们可以看出,一个变量可以有多个别名,从存储的角度来讲,先是给变量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;
}
做参数直接使用。
2.做返回值
int& count()
{
static int n=0;
n++;
return n;
}
int main()
{
int ret=count();
return 0;
}
做返回值不是把这个n做返回值,中间会产生一个临时变量,返回的是临时变量,这个临时变量就是n的别名,如果是函数调用的话n生成的临时变量就会被销毁,如果去访问就会出现野指针的问题,就不能用引用返回,出了作用域,返回变量存在才能引用返回。所以我们要加static保护起来,延长生命周期,使存储在静态区的数据生命周期与程序相同。
引用返回的意义
1.减少拷贝,提高效率
2.修改返回值