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

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

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{  int a;          //申请了一个名字为a的变量,开辟了一个地址,并且地址存入aint *pa=&a;     //这里int *表示申请一个指针变量,名叫pa,存入pa变量的值是a的地址//&a表示获取a变量所在的地址  cout<<pa<<endl;    //打印一下pa变量的所存的值,也就是a的地址*pa=30;             //也就是把pa变量所存的地址对应的变量a的存储值替换为30cout<<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的枚举变量名字为ienum ABCD &pi=i;                      //定义枚举变量i的引用别名pipi=c;                             //为别名变量pi 赋值cout<<"enum i is"<<i<<endl;struct Student stu;                   //命名结构体Student为stustruct Student &pstu=stu;             //结构体变量stu,我们引用变量别名为pstupstu.score=100;                       //为pstu中的score变量赋值100cout<<"结构体的stu.score is"<<stu.score<<endl;int c=1;                              //定义普通变量cint b=3;                              //定义普通变量bint *p=&c;                           //定义指针变量p,并赋值c的地址   int *&rp=p;                          //把指针变量p,引用别名rp//分开看这句代码int *是声明指针变量,&rp是引用变量名rprp=&b;                                //rp的值被覆盖为b的地址*rp=10;                              //rp所存地址的变量的值改为10cout<<"int b changes to"<<b<<endl;cout<<"rp的地址 is"<<rp<<endl;cout<<"b的地址"<<&b<<endl;int list[]={3,4,5};    //创建数组listint (&Rlist)[3]=list;   //给list数组 引用别名RlistRlist[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赋值10int &ra = a;     //引用变量ra对应aint &rra = a;    //引用变量rra对应aint &rrra = rra; //看起来引用变量rrra对应rra,但本质是对应aint &rrrra = rra;//看起来引用变量rrrra对应rra,本质还是对应变量arrra = 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的地址传给指针bint 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的引用(别名)是bint 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;
}

引用(Reference)相关推荐

  1. java reference 传引用_Java的引用(reference)---Roni

    摘自<Java面向对象编程>一书,作者:孙卫琴 来源:www.javathinker.org 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说 ...

  2. Java中各种引用(Reference)解析

    目录 1,引用类型 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5, PhantomReference 6, ...

  3. java byreference_Java中各种引用(Reference)解析

    1,引用类型 java.lang.ref整体包结构 类型 对应类 特征 强引用 强引用的对象绝对不会被gc回收 软引用 SoftReference 如果物理内存充足则不会被gc回收,如果物理内存不充足 ...

  4. Java篇 - 四种引用(Reference)实战

    Java的垃圾回收(GC)是虚拟机自动管理的,前面我有篇文章专门讲GC:<JVM篇 - GC给你整明白> Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看 ...

  5. java byreference_深入理解Java中的引用(一)——Reference

    深入理解Java中的引用(一)--Reference 本系列文章首先会介绍Reference类,为之后介绍的强引用.软引用.弱引用和虚引用打下基础. 最后会介绍虚引用在DirectBuffer回收中的 ...

  6. C++ 语言左值引用 (lvalue reference)

    C++ 语言左值引用 (lvalue reference) C++11 中新增了右值引用 (rvalue reference).当我们使用术语引用 (reference) 时,指的其实是左值引用 (l ...

  7. C++/C++11中左值、左值引用、右值、右值引用的使用

    C++的表达式要不然是右值(rvalue),要不然就是左值(lvalue).这两个名词是从C语言继承过来的,原本是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能. 在C++语言中,二者的区别就没 ...

  8. C++/C++11中引用的使用

    引用(reference)是一种复合类型(compound type).引用为对象起了另外一个名字,引用类型引用(refer to)另外一种类型.通过将声明符写成&d的形式来定义引用类型,其中 ...

  9. C++中Reference与指针(Pointer)的使用对比

    了解引用reference与指针pointer到底有什么不同可以帮助你决定什么时候该用reference,什么时候该用pointer. 在C++ 中,reference在很多方面与指针(pointer ...

最新文章

  1. 15crmo焊接后多长时间探伤_15CrMo十五铬钼属于合金钢?、下面来解释一下
  2. php 时间倒计时代码 个人写法 有好的想法的欢迎贴出来分享
  3. Ubuntu系统的安装
  4. jsonArray与 jsonObject区别与js取值
  5. linux 窗口不能移动的替换命令
  6. 对比学习在NLP和多模态领域的应用
  7. Node JS环境设置– Node.js安装
  8. Android 多媒体开发学习之撕衣服
  9. 你想要的宏基因组-微生物组知识全在这(2020.8)
  10. axure rp编辑html模板,AxureRP教程—用模板封装UI标准
  11. vue3中lottie动画的实现
  12. 网易裁员,让保安把身患绝症的我赶出公司。我在网易亲身经历的噩梦!
  13. Java联网3D坦克大战(网络编程)
  14. 25 scala 进阶
  15. 【考试总结贴】控制测量学
  16. 团队管理33-典型场景(向下沟通)
  17. IPv6的思科培训启用SSH在Cisco IPv6路由器
  18. PLC若想实现以太网口无线通讯,需要具备哪些条件?
  19. Axure 9.0入门设计APP界面
  20. requests实现登陆、点赞、批量点赞、取消点赞

热门文章

  1. 车端激光和双目相机的自动标定算法
  2. 想象中的论文答辩和真实的论文答辩!哈哈哈哈哈哈……
  3. CVPR 2021 | 基于稠密场景匹配的相机定位学习
  4. 目标检测一卷到底之后,终于有人为它挖了个新坑|CVPR2021 Oral
  5. 多目标跟踪:监控领域你必须要了解的算法
  6. 有哪些好的科研和学习习惯?
  7. LiteSeg: 一种用于语义分割的轻量级ConvNet
  8. SpringMVC如何实现aop
  9. bootstrap_fileinput上传文件 后台接受额外的参数
  10. 剑指 Offer 17. 打印从1到最大的n位数