引用(Reference)

先复习一下C语言中,指针的用法

a所在的地址即pa指针变量储存的值,和a改变后的值30

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{  int a;          //申请了一个名字为a的变量,开辟了一个地址,并且地址存入a
   int *pa=&a;     //这里int *表示申请一个指针变量,名叫pa,存入pa变量的值是a的地址
                     //&a表示获取a变量所在的地址  
   cout<<pa<<endl;    //打印一下pa变量的所存的值,也就是a的地址

   *pa=30;             //也就是把pa变量所存的地址对应的变量a的存储值替换为30
   cout<<a<<endl;
    return 0;
}

我们可以认为引用是给一个变量起了一个别名。我们分别写了各种数据类型的引用。

#include <iostream>
using namespace std;
//定义一个枚举ABCD,列举a,b,c,d
enum ABCD{   a,
             b,
             c,
             d,
};
//定义一个结构体Student,包含一个变量score
struct Student{
    int score;
};

int main(int argc, char *argv[])
{   int a=1;                           //定义了一个普通变量a,赋值为1              
    int &pa=a;                         //定义了一个引用变量pa,是a的别名
    pa=4;
    cout<<"int a is "<<a<<endl;             //看一下a的值是否改变 

   enum ABCD  i;                         //定义枚举类型ABCD的枚举变量名字为i
   enum ABCD &pi=i;                      //定义枚举变量i的引用别名pi
              pi=c;                             //为别名变量pi 赋值
     cout<<"enum i is"<<i<<endl;

 struct Student stu;                   //命名结构体Student为stu
 struct Student &pstu=stu;             //结构体变量stu,我们引用变量别名为pstu
 pstu.score=100;                       //为pstu中的score变量赋值100
 cout<<"结构体的stu.score is"<<stu.score<<endl;

 int c=1;                              //定义普通变量c
 int b=3;                              //定义普通变量b
 int *p=&c;                           //定义指针变量p,并赋值c的地址   
 int *&rp=p;                          //把指针变量p,引用别名rp
                                  //分开看这句代码int *是声明指针变量,&rp是引用变量名rp

 rp=&b;                                //rp的值被覆盖为b的地址
 *rp=10;                              //rp所存地址的变量的值改为10
 cout<<"int b changes to"<<b<<endl;
 cout<<"rp的地址 is"<<rp<<endl;
 cout<<"b的地址"<<&b<<endl;

  int list[]={3,4,5};    //创建数组list
  int (&Rlist)[3]=list;   //给list数组 引用别名Rlist
   Rlist[1]=9;       //更改数组Rlist中的第二个值
   cout<<"第二个值是"<<list[1]<<endl;
    return 0;
}

总的来讲,

  • 引用可以代表被引用的变量,进行各种操作,也就是对引用变量的操作就是    对被引用变量的操作处理;
  • 同时引用变量的声明和赋值是同时的,也就是在声明一个引用变量后就要写明它引用了哪个变量。同时,一但确定不能更改。

#include <iostream>
using namespace std;
//错误的代码
int main(){
    int a = 10;
    int b = 20;
    int &r = a;
    int &r = b;       //这是违规的操作,不能更改
                         // 只写&r = b也是错误的
                          //写成r = b就变成了赋值含义,也是不能改变被引用变量的
    getchar();
    return 0;
}

但是一个变量可以对应 多个 引用变量

在这里a、ra、rra、rrra、rrrra都是一样的,r…a本质都是a的引用,不存在引用的引用。
还有一个问题,其实引用只是给变量起了一些别名而已,地址并不会更改
我们看一下这个例子

#include <iostream>
using namespace std;

int main(){
    int a = 10;      //变量a赋值10
    int &ra = a;     //引用变量ra对应a
    int &rra = a;    //引用变量rra对应a
    int &rrra = rra; //看起来引用变量rrra对应rra,但本质是对应a
    int &rrrra = rra;//看起来引用变量rrrra对应rra,本质还是对应变量a
    rrra = 3;           //给任一个变量赋值
                    //这里写ra=3,rra=3···都是一样的
    cout << a + ra +rrrra <<endl;//打印一下他们相互相加

    return 0;
}

需要注意

  • 指向引用的指针不存在,因为引用就是被引用变量的别名,上面我们看到了他们的地址都是一样的
  • 引用数组也是错误的(不是上文的数组的引用 这个语言说不清我们上代码吧 )

#include <iostream>
using namespace std;
                                    //这是错误的写法
int main(){
    int a[] = {10,20};
    int &ra[2] = a;              //这是错误的写法,
                                        //int (&ra)[2]=a的写法才对    
    getchar();
    return 0;
}
 

举一个需要引用的例子
比如我们想交换两个变量的值,当然也可以用指针完成

#include <iostream>
using namespace std;

void swap(int *a,int *b){       //x的地址传给指针a,  y的地址传给指针b
   int c=*a;                    //指针a所存地址对应变量的值给c
      *a=*b;                  //指针b所存地址对应变量的值
                                 //覆盖指针a所存地址对应变量之前的值

      *b=c;            //c的值传给指针b所存地址对应变量的值
}

int main(int argc, char *argv[])
{  int x=3;
   int y=4;
cout<<x<<" "<<y<<endl;
      swap(x,y);                 //调用函数swap()
                                 //x,y变量的地址传给函数  
cout<<x<<" "<<y<<endl;
    return 0;
}

 

#include <iostream>
using namespace std;
void swap(int &a,int &b){         //变量x的引用(别名)是a
                                 //变量y的引用(别名)是b
  int c=a;
      a=b;
      b=c;
}
int main(int argc, char *argv[])
{ int x=3;
  int y=4;
cout<<x<<" "<<y<<endl;
swap(x,y);                           //这里可以不用传地址了!

cout<<x<<" "<<y<<endl;
    return 0;
}

 

 

#include <iostream>
using namespace std;int main(){
    int a = 1;
    int &ra = a;
    ra = 3*a;//用被引用变量的值的三倍给引用变量赋值
    cout << a <<endl;
    getchar();
    return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangchuang2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值