作者:虚实人生轶事 | 来源:互联网 | 2023-10-11 20:29
一、引用的概念我们可以把引用想象成一个数据的别名,通过类型+&+引用名变量名的方式定义当我们对引用名的数据更改时,原变量名对应的数据也会改变。代码如下:inta1;int&ba;c
一、引用的概念
我们可以把引用想象成一个数据的别名,通过 类型+&+引用名=变量名 的方式定义
当我们对引用名的数据更改时,原变量名对应的数据也会改变。代码如下:
int a=1;
int &b=a;
cout<endl;
a = 2;
cout<endl;
b = 1;
cout<
View Code 1可以理解为两个变量在内存中公用的一个数据,我们可以打印引用和原变量的地址:
int a=1;
int &b=a;
cout<<&a<<endl;
cout<<&b<
View Code 2可以发现两个地址是相同的
二、引用的适用范围
引用本质上是另一个变量名,只不过这个声明的变量和原本的变量名共用一个内存地址
以下对象可以被引用:
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
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="<endl;
cout<<"y="<endl;
}
View Code 3如果用引用就可以这么写:
#include
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="<endl;
cout<<"y="<endl;
}
View Code 4**同名、同类型参数无法让编译器识别使用何种函数
2.让一个函数起到多个返回值的作用
我们可以利用引用直接用外部变量接收多个函数的结果
这个时候宇宙超级无敌霹雳旋风终极无敌版V2.0就可以做更新了
#include
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){
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<<"最大的数是"<"\n它在第"<"行第"<"个"<<endl;
findst(p,3,4,min,res,y,x);
cout<<"最小的数是"<"\n它在第"<"行第"<"个";
}
宇宙超级无敌霹雳旋风终极无敌版V2.1
3.用引用作为返回值,不生成值的副本,实现返回方式的多样性
4.函数调用作为左值
5.用const限定引用
6.返回堆变量中的引用