你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

指针和引用有什么区别?该如何引用?

[复制链接]
gaosmile 发布时间:2020-6-11 20:38
先抛出两个问题:
  • 指针和引用有什么区别?
  • 什么时候应该使用指针?什么时候应该使用引用?

01指针和引用的区别
首先看一段代码:

  1. int a = 1;
  2. int b = 2;
  3. int *c = nullptr;
  4. c = &a;
  5. int &d = b;
复制代码

指针其实就是一个存放内存地址的整数,这个整数表示的是被指向的变量的地址。
引用其实就是变量的别名,就是给变量重新起了一个名字,注意引用既然是个别名,那它一定要有本体,一个人叫王二小,我们也可以给它起个别名叫二蛋,我们提到二蛋和王二小其实都是同一个人。
区别:
  • 指针在声明时可以暂时不初始化,即pointer = nullptr,指针在生命周期内随时都可能是空指针,所以在每次使用时都要做检查,防止出现空指针异常问题,而引用却不需要做检查,因为引用永远都不会为空,它一定有本体,一定得代表某个对象,引用在创建的同时必须被初始化。

    1. void FuncPtr(int *ptr) {
    2.   if (ptr != nullptr) {
    3.     cout << *ptr;
    4.   }
    5. }

    6. void FuncReference(int &ref) {
    7.     cout << ref;
    8. }
    复制代码


  • 指针存放的是地址,指针可以被重新赋值,可以在初始化时指向一个对象,在其它时刻也可以指向另一个对象,而引用非常专一,它会从一而终,它总是指向它最初代表的那个对象。再举个例子,有一个人叫特朗普,为他起个引用别名叫历史上最傻吊的总统,这个引用一定会从一而终,即无论什么时候,历史上最傻吊的总统一定是特朗普。而美国总统可以当作个指针,一段时间可以是奥巴马,过一段时间可以是特朗普,再过一段时间可能是nullptr。


02指针和引用的使用场景
引用的主要功能就是作为函数的参数和返回值,看一段代码:

  1. struct A {
  2.     int a;
  3. };
  4. void func(const A &a) {
  5.     cout << a.a;
  6. }

  7. vector<int> vec(10);
  8. vec[3] = 3;
复制代码

为什么通过vec[3] =3可以改变vector容器的值,因为[]操作符返回的就是引用,相当于为内部的变量起了一个别名,这里还可以让[]操作符返回一个指针,即*vec[3]=3,这是不是有点丑,而且不符合语法需求。

其实我们平时编程过程中可能也注意到,实际上引用可以做的事情指针都可以做,但为什么还要引用这个东西?
答案:
用恰当的工具做恰如其分的工作,指针可以毫无约束的操作内存中的任何东西,功能十分强大,但是也很危险,所以可以在恰当的时机使用引用,当你需要指向某个东西,而且一定专一,绝不会让其指向其它东西,例如有些函数参数为了避免拷贝可以使用引用,或者实现一个操作符而其语法需求无法由指针达成,例如vec[3]=3,可以使用引用,其它任何时候,都要使用指针。


引用在c++11后其实有很多知识点,具体可以看我之前的文章:
参考资料
《More Effective C++》
http://www.runoob.com/w3cnote/cpp-difference-between-pointers-and-references.html
http://blog.csdn.net/weikangc/article/details/49762929
http://www.jianshu.com/p/e548a978d737
http://zhuanlan.zhihu.com/p/63096392

收藏 评论0 发布时间:2020-6-11 20:38

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版