引用和指针是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