引用(Reference)
先复习一下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)相关推荐
- java reference 传引用_Java的引用(reference)---Roni
摘自<Java面向对象编程>一书,作者:孙卫琴 来源:www.javathinker.org 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说 ...
- Java中各种引用(Reference)解析
目录 1,引用类型 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5, PhantomReference 6, ...
- java byreference_Java中各种引用(Reference)解析
1,引用类型 java.lang.ref整体包结构 类型 对应类 特征 强引用 强引用的对象绝对不会被gc回收 软引用 SoftReference 如果物理内存充足则不会被gc回收,如果物理内存不充足 ...
- Java篇 - 四种引用(Reference)实战
Java的垃圾回收(GC)是虚拟机自动管理的,前面我有篇文章专门讲GC:<JVM篇 - GC给你整明白> Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看 ...
- java byreference_深入理解Java中的引用(一)——Reference
深入理解Java中的引用(一)--Reference 本系列文章首先会介绍Reference类,为之后介绍的强引用.软引用.弱引用和虚引用打下基础. 最后会介绍虚引用在DirectBuffer回收中的 ...
- C++ 语言左值引用 (lvalue reference)
C++ 语言左值引用 (lvalue reference) C++11 中新增了右值引用 (rvalue reference).当我们使用术语引用 (reference) 时,指的其实是左值引用 (l ...
- C++/C++11中左值、左值引用、右值、右值引用的使用
C++的表达式要不然是右值(rvalue),要不然就是左值(lvalue).这两个名词是从C语言继承过来的,原本是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能. 在C++语言中,二者的区别就没 ...
- C++/C++11中引用的使用
引用(reference)是一种复合类型(compound type).引用为对象起了另外一个名字,引用类型引用(refer to)另外一种类型.通过将声明符写成&d的形式来定义引用类型,其中 ...
- C++中Reference与指针(Pointer)的使用对比
了解引用reference与指针pointer到底有什么不同可以帮助你决定什么时候该用reference,什么时候该用pointer. 在C++ 中,reference在很多方面与指针(pointer ...
最新文章
- 15crmo焊接后多长时间探伤_15CrMo十五铬钼属于合金钢?、下面来解释一下
- php 时间倒计时代码 个人写法 有好的想法的欢迎贴出来分享
- Ubuntu系统的安装
- jsonArray与 jsonObject区别与js取值
- linux 窗口不能移动的替换命令
- 对比学习在NLP和多模态领域的应用
- Node JS环境设置– Node.js安装
- Android 多媒体开发学习之撕衣服
- 你想要的宏基因组-微生物组知识全在这(2020.8)
- axure rp编辑html模板,AxureRP教程—用模板封装UI标准
- vue3中lottie动画的实现
- 网易裁员,让保安把身患绝症的我赶出公司。我在网易亲身经历的噩梦!
- Java联网3D坦克大战(网络编程)
- 25 scala 进阶
- 【考试总结贴】控制测量学
- 团队管理33-典型场景(向下沟通)
- IPv6的思科培训启用SSH在Cisco IPv6路由器
- PLC若想实现以太网口无线通讯,需要具备哪些条件?
- Axure 9.0入门设计APP界面
- requests实现登陆、点赞、批量点赞、取消点赞