码迷,mamicode.com
首页 > 其他好文 > 详细

引用和指针

时间:2018-09-06 02:59:53      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:拷贝构造   动态内存分配   传递   空间   copy   完成   sdn   阅读   大小   

引用和指针

引用和指针的区别什么?

什么是引用, 声明和使用引用要注意哪些问题

  1. 引用简单的理解就是某个目标变量的别名(alias), 对应用的操作与对变量直接操作效果完全相同;
  2. 声明一个引用的时候一定要对其进行初始化, 引用声明完成后, 相当于目标值有两个完全不同的名称;
  3. 引用本身不是一种数据类型, 因此引用本身不占用存储单元, 系统也不给引用分配存储单元;
  4. C++中引用的底层实现;
    • 引用在内存中也会分配空间,空间中存放的事被引用变量的地址,因此可以将引用看作为一个常量指针ptr;
    • 对引用取地址操作,其实是对被引用变量取地址,编译器将对引用取地址解释为&(*ptr)取地址;
  5. 更深入的理解是: 引用看作是一个常量指针ptr; 从底层来看, 引用确实占用了内存;
    • 本质上,引用和指针没有区别, 只不过在语言层面上,C++设计者将通过指针来操作引用的实现细节隐藏了。不过,我们依然可以肯定:
      • 定义一个引用就是定义一个指针,这个指针保存引用对象的地址,且指针类型为const,不可以再指向其他对象;
      • 每次对引用变量的使用,实际都伴随着解引用,只是我们看不到符号*, 解完引用就对应着类型的大小;
      • 所以内置类型直接传值就ok, 只有copy时需要大量的时间采用引用或指针;
    • 理解C++中引用的底层实现

什么是指针

  1. 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;

引用和指针的区别 --- 本质区别是引用是一个别名, 不占内存

  1. 引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化;
  2. 可以有const指针, 但是没有const引用, const不能修饰引用;
  3. 指针可以有多级,但是引用只能是一级;
  4. 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
  5. 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了;
  6. sizeof引用得到的是所指向的变量(对象)的大小,而sizeof指针得到的是指针本身的大小;
  7. 指针和引用的自增(++)运算意义不一样(指针自加和对象自加);
  8. 返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏, 为什么会发生内存泄漏?
    • 如果分配的空间比返回类型的空间大, delete对象后还会剩余一部分空间没有被释放掉, 造成内存泄漏;

引用作为函数参数有哪些特点

  1. 传递引用给函数与传递指针的效果是一样的;
  2. 使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;
  3. 而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;
  4. 如果传递的是对象,还将调用拷贝构造函数, 因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好;
  5. 使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;
  6. 另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰;

引用和指针

标签:拷贝构造   动态内存分配   传递   空间   copy   完成   sdn   阅读   大小   

原文地址:https://www.cnblogs.com/longjiang-uestc/p/9595403.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!