一、引用的概念
我们可以把引用想象成一个数据的别名,通过 类型+&+引用名=变量名 的方式定义
当我们对引用名的数据更改时,原变量名对应的数据也会改变。代码如下:

int a=1;
int &b=a;
cout<<b<<endl;
a = 2;
cout<<b<<endl;
b = 1;
cout<<a<<endl;
可以理解为两个变量在内存中公用的一个数据,我们可以打印引用和原变量的地址:

int a=1;
int &b=a;
cout<<&a<<endl;
cout<<&b<<endl;
可以发现两个地址是相同的
二、引用的适用范围
引用本质上是另一个变量名,只不过这个声明的变量和原本的变量名共用一个内存地址
以下对象可以被引用:
1.int、float、double、char等类型定义的变量
2.指针变量 int *a;int *&p=a;
3.常量变量 const int&h=3
const int *b;const int *&pb
4.数组
5.引用 (无限套娃)
以下对象不可以被引用:
1.void变量(我也不知道这个引用到底有啥用
2.没有引用的引用,没有引用的指针(禁止套娃)
3.没有空引用,即不能像指针一样指向空值
三、引用的应用
1.做函数的形式参数
比如一个最简单的数据交换函数
如果是指针作为参数是这样子的:

#include<iostream>
using namespace std;
void swap(int *x,int *y)
{
int temp=*x;
*x=*y;
*y=temp;
}
int main(){
int x=1,y=2;
swap(&x,&y);
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
如果用引用就可以这么写:

#include<iostream>
using namespace std;
void swap(int &x,int &y)
{
int temp=x;
x=y;
y=temp;
}
int main(){
int x=1,y=2;
swap(x,y);
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
**同名、同类型参数无法让编译器识别使用何种函数
2.让一个函数起到多个返回值的作用
我们可以利用引用直接用外部变量接收多个函数的结果
这个时候宇宙超级无敌霹雳旋风终极无敌版V2.0就可以做更新了

#include<iostream>
using namespace std;
int max(int a,int b)
{
if(a>b)
{
return a;
}
return b;
}
int min(int a,int b)
{
if(a<b)
{
return a;
}
return b;
}//比较
void findst(int *p,int h,int l,int (*func)(int,int),int &res,int &y,int &x)
{
res=*p;
int num=0;
for(int i=1;i<h*l;i++){
int bak = func(res,p[i]);
if(res!=bak){
res = bak;
num=i;
}
}
y=num/l+1;
x=num%l+1;
return;
}//“打擂台”
int main()
{
/*矩阵实战*/
int d[3][4]={{1,2,3,4},{4,5,6,7},{7,8,9,10}};
int *p=&d[0][0];
int res,x,y;
findst(p,3,4,max,res,y,x);
cout<<"最大的数是"<<res<<"\n它在第"<<y<<"行第"<<x<<"个"<<endl;
findst(p,3,4,min,res,y,x);
cout<<"最小的数是"<<res<<"\n它在第"<<y<<"行第"<<x<<"个";
}
3.用引用作为返回值,不生成值的副本,实现返回方式的多样性
4.函数调用作为左值
5.用const限定引用
6.返回堆变量中的引用
来源:https://www.cnblogs.com/applerun/p/12572045.html
