区分指针和引用
指针和引用是C++中非常基础的概念,它们通常可以做相同的事情,可以帮助找到对应的对象,但是它们表现形式不一样,有着一些本质的区别。我们需要知道它们有什么区别,什么时候使用指针,什么时候使用引用。
指针(pointers)使用*
和->
操作符,而引用(references)使用&
和.
操作符。
指针指向所指对象的内存地址,它的内容是所指内存的首地址。而引用则是某块内存的别名,或者说是其表示对象的别名。
比如上海市这个我们要操作的对象,当我们需要找到它时,我给了你一个纸条,上面写着东经120°52,北纬30°40′,这个纸条就是指针,你可以通过它找到上海的位置。而另外,上海又叫着魔都,这次没有纸条,魔都只是一个名字,不是实体,但是你可以通过这个名字直接操作,比如魔都.封城(3个月)
和纸条->封城(3个月)
,这两个操作会做相同的事情。
所以可以理解,指针保存的是所指对象的地址(实体),引用仅仅是对象的别名(非实体),指针需要通过解引用间接访问,而引用是直接访问。
C++开发者需要认知到,没有所谓的null reference,因为引用是一个对象的别名,一个引用一定是代表了某个对象。
当然,如果你特别杠精,要这么问,下面这种情况是个啥情况:
1 | int *num1 = nullptr; |
这种情况,编译器可能回编译通过,但是不要这么干,永远不要对null pointer引用。
加上上面提到的这个,建议记住这三点:
- 没有所谓的null reference
- 引用必须有初始值。因为它一定是代表某个对象。
- 指针可以被重新赋值,但是引用始终代表它最初获得的那个对象(那块内存)。
上面的第三点,我们可以看看下面的操作:
1 | 城市 上海; |
上面这段并不是代表魔都
以后是安徽
的别名了,魔都
依然代表了上海这个城市,只不过这个城市已经变成了安徽
,它们是地图上的两个地方,但是是两个长得一模一样的城市了,都是安徽
那般模样,而魔都
还是代表靠海那个地方,始终没变。