引用概念
引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟他和他引用的变量共同用一块内存空间。
这个就是引用
通过取地址也能看出来,i和k的地址明显是相同的
我们也可以再给别名取别名
以前写交换函数时只传值的话不能改变具体数值,只有传地址才可以
现在使用引用同样也能实现这一效果,这里的形参就是一个别名
而且还能给指针取别名,rp就是指针p的别名
这个函数是改变结构体的值就要传结构体指针的地址,用二级指针可能会有点复杂,所以就可以使用引用
引用特性
1、引用在定义时必须初始化
2、一个变量可以有多个引用
3、引用一旦引用一个实体,就不能再引用其他实体
引用的作用
1、做参数,做输出型参数
可以将如图的二级指针参数多次简化
2、做返回值
这里有段代码
n已经被static过了,现在放在静态区,返回的时候还需要创建一个临时变量才能返回到main函数
但是如果使用引用返回,就不会再创建临时变量了,而是n的一个别名,其实就是n
这个叫做传引用返回(出了作用域这个变量还在的情况下使用传引用返回)
传引用返回首先是可以减少拷贝
然后是可以修改返回对象
这种情况下数组里的值并不是在PosAt函数的栈帧里,所以出了这个函数就不会销毁,就可以直接使用引用返回,使用引用返回就减少了拷贝
而且在后面的main函数里还可以修改这个位置的值
注:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回,如果使用引用返回,结果是未定义的
这个就是例子
长引用
首先要知道,权限只能缩小不能放大,并且权限也可以保持,这样的引用就是权限的平移
这样的引用就是权限的放大了,引用是这样,指针也是这样。本来const修饰后就只能读不能改变了,但是起了别名后就又能修改,就属于权限的放大(只使用指针和引用)
这时我们只要改成权限的保持就行
这个叫做权限的缩小
还有一种,const函数返回的并不是n,而是一个临时变量,这个变量具有常性,所以接收的变量也要用const修饰
还有这段代码,加个const突然就可以了;这其实因为变量的强制类型转换并不是将原有的变量转换了,而是先定义一个临时变量存放转换后的值,接着再将临时变量的值赋给要转换的变量,所以说ird接收其实是个临时变量的值,那就要进行权限保持
指针和引用的区别
从汇编语言其实可以看出,引用的操作其实和指针是一样的;在表层上面引用是不开空间的,但其实在汇编方面引用也是用指针实现的
但是