指针和引用区别

引用和指针是c++中最重要的概念,在c中只有指针没有引用,在其他语言(java,python,php等,只有引用没有指针)。指针还是引用这个问题其实已经困惑我很就了,今天找机会记录一下。主要是因为最近在刷cs106b,里面说参数传入能用就用引用,这里我来解释两者区别

一、指针篇

首先来说一说指针,我们经常可以看到这样声明指针:

int variable

int *pointer

这里的*声明了我们变量pointer是一个指针

指针存放的是内存地址

所以 pointer =&variable

&就是取地址的命令,注意,不要把它和引用混淆,用override的概念去理解,它做的只有取地址!!!

这样我们的指针就存放一个地址了

值得注意的是:我们想当然地把 &当成取地址符,其实它比我们想象得要有用得多

那么怎么通过指针访问变量的值呢,这时就需要derefercing (*pointer)

二、引用篇(其实引用实现方法和指针相似,没想到把)

引用是原来对象的别名,我们可以想像,在一个内存地址中,box这个变量存有1这个数,然后,我们又想具体化这个变量,于是我们给它起了个别名叫blueBox,这样,在一个地址中有两个变量,一个值。不管修改blueBox还是box,这个值都会被修改。值得注意的是,一旦我们用blueBox来代指box,blueBox就不能和其他变量组合了,山无棱,天地合,乃敢与君别。

同时,引用和指针本是同根生。所以,引用传入参数时是传入地址的。但相比指针,定义引用后我们再使用引用的变量,电脑直接帮我们dereference并返回值,很方便吧。

理解指针和引用最重要的概念

突然感慨override这个概念,也就是同一个函数,运用的对象不同,得到的结果也不同。我觉得是理解指针和引用最重要的概念,在定义和传参阶段,前面的*和&是定义它的类型,而指针定义中&取地址是另一个函数

三、指针和引用区别

1.引用是一个定量(也可以把它看成是固定的指针,也就是说一旦和变量联系后不能改变),同时它的声明和定义必须在同一行进行:

int variable = value

int & reference =  variable

   而int & reference 

      reference = variable是不允许的

   同样重复赋值也是不允许的  int& reference = variable1

2.引用必须对已经有的变量使用,本质上是取原变量的别名,而指针变量可以存放空元素

 int * pointer (我们还不知道他要指向谁,算了,先这样写,等到想好了再来设置)

3.指针可以间接指向,可以通过多层reference获取变量。打个比方,我认识隔壁村王大爷,王大爷认识隔壁村赵大妈,赵大妈又有一个回眸一笑百媚生,六宫粉黛无颜色的女儿杨玉环,那我就可以顺着这几层关系勾搭到杨玉环

我们先定义变量类型

person 我

person 王大爷

person 赵大妈

person 杨玉环

然后设置关系网

address *network =  &我

address **network =  &王大爷

address ***network =  & 赵大妈

address ****network =  &杨玉环

这样我可以通过 ****network 找到杨玉环了

4.引用变量创建后我们在使用它时默认derefencing了,所以我们可以直接使用这个变量。而获取指针时要用*

5.引用时占用内存少,和原来的变量共同占用一个空间,而指针必须有自己独立的内存空间,这也是为什么使用引用的原因,当然这一点无关紧要,毕竟指针占的位置也不多

相同点,作为参数传入时都是作为地址传入,都可以在函数里改变

三、用指针还是引用

使用引用的情况:函数的输入输出,一个很重要的原因在于确认传进去参数是否已经存在

使用指针的情况:一些值可以为空(null)的情况,比如数组。在很多数据结构,如树,链表等,也缘于这个原因,使用指针偏多。同时,多层指针的情况


 

四、传入参数

传入指针或引用情况1.对原有的变量进行修改

                             2.我们传入一个很大的对象或数据结构,会运用很多内存

引用文章的链接:Why do we need reference variables if we have pointers - GeeksforGeeks

                             Pointers vs References in C++ - GeeksforGeeks

                             c++ - References and Pointers both store addresses? - Stack Overflow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值