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

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

[复制链接]
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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版