zoukankan      html  css  js  c++  java
  • C++中指针和引用的区别比较

           很多人一定都有这样的疑惑,包括我之前也不是很清楚,经过学习一段时间QT之后,想把自己的总结和心得和大家分享一下。

           先明确一下什么是指针,什么是引用。

    指针:

           指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。使用*定义指针。

    引用:

           引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样

    指针和引用的区别:

          1.指针是一个实体,而引用仅是个别名;

          2.引用必须被初始化,指针不必;

          3.引用只能在定义时被初始化一次,之后不可变;指针可以改变所指的对象;

          4.可以有const指针,但是没有const引用;

          5.不存在指向空值的引用,但是存在指向空值的指针,即引用不能为空,指针可以为空;

          6.“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;

          7.指针和引用的自增(++)运算意义不一样; 指针自增指向下一个地址,而引用是对变量本身的值的增加。

          8.程序为指针变量分配内存区域,而引用不需要分配内存区域;

          9.指针可以有多级,但是引用只能是一级,例如int **p是合法的,而 int &&a是不合法的; 

          10.指针和引用作为函数参数进行传递时也不同。用指针传递参数,可以实现对实参进行改变的目的;在将引用作为函数参数进行传递时,实质上传递的是实参本身,而不是实参的一个拷贝,因此对形参的修改其实是对实参的修改。

           总而言之指针与引用的一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。

    指针和引用的相同点:

          两者都是地址的概念,指针指向一块儿内存,其内容为所指内存的地址;引用是某块儿内存的别名。

     区分用指针和引用的不同情况:

    使用引用的情况:

            1.常引用,用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性,函数体不能对引用型参数修改目标变量。声明方式:const  类型标识符  &引用名 = 目标变量名

            2.作为函数的返回值,当类A的数据成员包含B类的对象,可以在类A中定义一个方法,返回B类的对象的引用,返回的是引用就不会有副本产生,可以直接修改类对应类B的对象。

    函数定义时要按以下格式:

        类型标识符  &函数名 (形参列表及类型说明)

        {  函数体  }

    引用作为返回值,必须遵守以下规则:

      1.不能返回局部变量的引用,主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。

      2.不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成内存泄漏。

    使用指针和引用的情况对比:

            1.是考虑到存在不指向任何对象的可能(在这种情况下,能够设置指针为空)

            2.需要能够在不同的时刻指向不同的对象(在这种情况下,能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么就应该使用引用。

            3.重载某个操作符时,应该使用引用。当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。

  • 相关阅读:
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第八章FPGA片内FIFO读写测试实验
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第七章 FPGA片内ROM测试实验
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第六章 FPGA片内RAM读写测试实验
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第五章 Vivado下PLL实验
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第四章 PL的LED实验
    在Mac OS X中使用VIM开发STM32(3)
    在Mac OS X中使用VIM开发STM32(2)
    STM32F40xxx 与 STM32F41xxx Flash结构详解
    在Mac OS X中搭建STM32开发环境(3)
    在Mac OS X中搭建STM32开发环境(2)
  • 原文地址:https://www.cnblogs.com/Wangjiaq/p/9220715.html
Copyright © 2011-2022 走看看