专栏首页深度学习与计算机视觉C++ 指针和引用的区别

C++ 指针和引用的区别

指针是C系语言的一大特色,也在很大程度上体现着C/C++的精髓,一个数据对象的内存地址称为该数据对象的指针。本质上指针是一个变量,所以它有自己的类型,这个类型决定了它可以指向何种类型的数据对象;之所以使用数据对象这个说法,是因为指针能够代表的远远不止变量,还包括数组,数组元素,结构体,甚至函数。

引用是C++对C语言的一个补充,它的作用是为一个变量起一个别名。 个人理解:很多时候下把“引用”当做一个名词来理解会更顺畅一些,比如说定义一个引用,某某的引用,当然这个是个人观点,并没有严格的论证。

那么从指针与引用的区别的角度考虑二者的特性的话,有下面几点:

(1)非空区别: 在任何情况下都不能使用指向空值的引用, 一个引用必须总是指向某些对象。 换句话说一个引用在声明的时候就必须要初始化(除了作为函数的参数),而指针是没有这个问题的,我们在定义一个指针但是不让它指向任何对象,是完全可以的:

    //错误,需要初始值
    int &b;
    //正确
    int *p;

因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。 相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高。

(2)合法性区别: 在使用引用之前不需要测试它的合法性。 相反,指针则应该总是被测试,防止其为空。这个问题和上面的其实是对应的,既然指针在定义的时候可以为空,但是一个为空的指针对实现一个功能是没有用的,为了代码的鲁棒性,我们必须时刻考虑指针为空的情况,这在指针作为函数的参数时尤为常见。

(3)可修改区别: 指针与引用的另一个重要的区别是指针可以被重新赋值以指向另一个不同的对象。 但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。 由于引用的声明和初始化总是在一起的,所以不可能让一个对象的引用指向另一个,这完全没有道理,假设a的引用是c,那么在执行int &c=b;就重定义了,如果执行c = b;,那么只是把b的值赋值给c,也就是a。

    int a =1;
    int b =2;
    int &c=a;
    int *p=&a;
    cout<<c<<endl;
    cout<<a<<endl;
    c = b;
    p = &b;

    cout<<c<<endl;
    cout<<a<<endl;

(4)应用区别: 以上的特性决定了指针和引用的一些应用上的区别,总的来说,在以下情况下应该使用指针:一是考虑到存在不指向任何对象的可能(在这种情况下,能够设置指针为空),二是需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么应该使用引用。

(5)补充 不能建立数组的引用,指针是可以代表数组的,指向数组的指针是数组的首地址,但是引用是不可以的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++ 指针常量与常量指针

    吐槽一下: 指针常量与常量指针的翻译就好比机器学习中Regularization翻译成正则化一样,讲真,正则化这个说法确实要比规则化显得高端些,但是到了理解...

    chaibubble
  • C++工厂模式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    chaibubble
  • 算法-斐波那契数列

    题目: 写一个函数,输入为n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列定义如下: ? 解题思路: 斐波那契问题是个非常经典的递归...

    chaibubble
  • 指针和引用

    注:参考自bilibili系列视频,指针和引用视频https://www.bilibili.com/video/BV1kT4y177WE

    瑶瑶
  • 大数据基础系列之JAVA引用详解

    一,四种引用介绍 从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员...

    Spark学习技巧
  • JAVA 引用详解

    引用链条可以说是jvm垃圾回收的根本,而且很多编程都可以利用引用类型和jvm之间的关系来做一些系统优化。比如spark,缓存及广播变量的回收等就是采用的弱引用。...

    Spark学习技巧
  • LeetCode | 使用双指针解决11号题

    第4题号还有二分查找和分治算法,算法比较复杂。那我就接着做下一道题号,第11题号。

    我脱下短袖
  • 教妹学Java:Spring Bean 的配置篇

    你好呀,我是沉默王二,一枚有趣的程序员,写的文章一直充满灵气,力求清新脱俗。昨天跑去王府井的小米店订购了一台小米 10,说是一周之内能到货,但我还是忍不住今天就...

    沉默王二
  • 厚土Go学习笔记 | 16. go语言有指针 没有指针运算

    指针内其实就是保存了一个变量地址。 var p *int 这行代码声明了一个 int 类型的指针 p i := 42 p = &i & 符号是取地址符,&i 代...

    李海彬
  • int *ptr2=(int *)((int)a+1);

    首先明确,a是一个具有4个整型变量的数组的名字,具体地说是这种数组的首元素的首地址,而&a是数组的首地址,请注意措辞。而关于指针加1,则需要指针运算的知识。没学...

    用户5426759

扫码关注云+社区

领取腾讯云代金券