美文网首页
面试系列之指针和引用的使用场景

面试系列之指针和引用的使用场景

作者: this_is_for_u | 来源:发表于2020-06-15 14:03 被阅读0次

先抛出两个问题:

  • 指针和引用有什么区别?
  • 什么时候应该使用指针?什么时候应该使用引用?

指针和引用的区别

首先看一段代码:

int a = 1;
int b = 2;
int *c = nullptr;
c = &a;
int &d = b;

指针其实就是一个存放内存地址的整数,这个整数表示的是被指向的变量的地址。

引用其实就是变量的别名,就是给变量重新起了一个名字,注意引用既然是个别名,那它一定要有本体,一个人叫王二小,我们也可以给它起个别名叫二蛋,我们提到二蛋和王二小其实都是同一个人。

区别:

  • 指针在声明时可以暂时不初始化,即pointer = nullptr,指针在生命周期内随时都可能是空指针,所以在每次使用时都要做检查,防止出现空指针异常问题,而引用却不需要做检查,因为引用永远都不会为空,它一定有本体,一定得代表某个对象,引用在创建的同时必须被初始化。

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

指针和引用的使用场景

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

struct A {
    int a;
};
void func(const A &a) {
    cout << a.a;
}

vector<int> vec(10);
vec[3] = 3;

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

其实我们平时编程过程中可能也注意到,实际上引用可以做的事情指针都可以做,但为什么还要引用这个东西?

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

引用在c++11后其实有很多知识点,具体可以看我之前的文章:

参考资料

《More Effective C++》

https://www.runoob.com/w3cnote/cpp-difference-between-pointers-and-references.html

https://blog.csdn.net/weikangc/article/details/49762929

https://www.jianshu.com/p/e548a978d737

https://zhuanlan.zhihu.com/p/63096392
更多文章,请关注我的V X 公 主 号:程序喵大人,欢迎交流。

相关文章

  • 面试系列之指针和引用的使用场景

    先抛出两个问题: 指针和引用有什么区别? 什么时候应该使用指针?什么时候应该使用引用? 指针和引用的区别 首先看一...

  • Java.2018-08-01

    Java简介 Java语言不使用指针,而是引用指针和引用区别1指针和引用区别2 只支持类之间的单继承,但支持接口之...

  • [C++]引用形参和指针形参的使用场景

    [C++]引用形参和指针形参的使用场景 在设计函数时,应根据传入参数的值是否会被改变,来决定是使用引用形参还是指针...

  • 引用与指针

    指针是一个实体,而引用仅是个别名; 引用使用时无需解引用(*),指针需要解引用; 引用只能在定义时被初始化一次,之...

  • Go 语言学习笔记-指针、切片与结构体

    指针 指针就是地址。指针变量就是存储地址的变量 指针使用 &p : 引用*p : 解引用、间接引用 栈帧 用来给函...

  • 面试 - handle之看Looper详谈ThreadLocal

    面试handler系列:面试 - handle使用及原理(1) 面试 - handle之详谈Message(2) ...

  • C++之指针和引用

    指针和引用的区别? 在C++的编码中我们发现很多地方都大量地使用引用,能用指针实现的功能改用引用几乎也能实现,甚至...

  • 多级指针

    多级指针注意引用即可,主要的还是多级指针和动态内存之间的跨函数使用内存

  • 音视频开发之旅(20) 指针、内存模型、引用

    目录 指针 内存模型和四区使用 引用 资料 收获 一、指针 1.1 什么是指针? 指针本质上是地址,用于指向具体的...

  • 指针和引用

    这里说一说指针和引用的区别。 是否可修改:指针可以更改指向的对象,而引用从一而终,不可修改。 合法性:指针使用前必...

网友评论

      本文标题:面试系列之指针和引用的使用场景

      本文链接:https://www.haomeiwen.com/subject/wfgcxktx.html