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

一、引用的概念

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

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

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

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

    int a=1;
    int &b=a;

    cout<<&a<<endl;
    cout<<&b<<endl;
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<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;
}
View Code 3

如果用引用就可以这么写:

#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;
}
View Code 4

**同名、同类型参数无法让编译器识别使用何种函数

 

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<<"";
}
宇宙超级无敌霹雳旋风终极无敌版V2.1

 

3.用引用作为返回值,不生成值的副本,实现返回方式的多样性

4.函数调用作为左值

5.用const限定引用

6.返回堆变量中的引用

 

posted on 2020-03-26 08:16  crazyplayer  阅读(124)  评论(0编辑  收藏  举报

导航