小沈的C++学习8——引用


一、引用的概念

我们可以把引用想象成一个数据的别名,通过 类型+&+引用名=变量名  方式定义 

当我们对引用名的数据更改时,原变量名对应的数据也会改变。代码如下:

int a=1;
    int &b=a;
    cout<endl;
    a = 2;
    cout<endl;
    b = 1;
    cout<

 1

可以理解为两个变量在内存中公用的一个数据,我们可以打印引用和原变量的地址:

    int a=1;
    int &b=a;

    cout<<&a<<endl;
    cout<<&b<

 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;
}
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;
}
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.返回堆变量中的引用

cpp