引用 与 指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了引用 与 指针相关的知识,希望对你有一定的参考价值。

  我们知道,引用 和 指针都是C++的符合类型之一。

一  关于引用

  引用(reference) 是为对象起了另外一个名字,引用类型 引用  另外一种类型。

  和初始化变量不同的是, 在定义引用的时候,程序把引用和它的初始值  绑定 在一起,而不是把初始值拷贝给引用。两者是绑定在一起,那么,就可以通过引用去修改初始值

例: int val = 20; int &ri = val ; ri  = 82; 那么此时val的值也会更改为82,反之成立。

  一但初始化完成,引用将和它的初始值对象一直绑定在一起,无法重新绑定其他的对象,因此,引用必须初始化。形如  int &ri ;就是错误的 ,因为其没有初始化。

  tip1: 引用的本身并不是对象,所以无法定义引用的引用。

  tip2 : 引用必须绑定在一个对象上,引用类型的初始值必须是一个对象。  int &ref = 0 ; //错误 ,引用类型的初始值必须是一个对象。

二 关于引用的部分使用

  1、传递可变参数

    函数参数不具备传递值得作用,我们可以通过引用的使用来传递可变参数。

  2、给函数传递大型对象
    当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的
  副本,也就是参数传递时,对象无须复制。可以极大的节省内存使用。
 
三 关于指针
  指针 与引用类似,也能完成对其他的对象的间接访问。
  但是, ① 指针本身是一个对象,允许指针赋值和拷贝,而且在其生命周期内允许指向多个不同的对象。②指针无须在定义时赋初值。
  指针  本身存放的是一个对象的 地址。如果有这样的代码  int a = 20; int *p = a; std::cout << p; 会输出一个地址给你 。而且其在获取对象的地址的时候,需在对象前面加上一个取地址符“&”;tip : 注意其和引用的区别。
 
  tip : 我们从上文中可以知道,引用本身并不是一个对象,所以无法定义指向引用的指针。这点也可以侧面说明对象前面的 & 不是取地址符。
  tip  : 值得注意的是,除特殊的情况外, 其他所有指针的类型都必须和它所指向对象严格匹配。如果不匹配,操作会出现错误。
 
建议:
  建议初始化所有的指针!
    虽然说到指针在定义时无须赋初始值,但是使用未定义的指针会造成程序运行错误,且其后果无法预计, 一般会造成程序崩溃。在多数的编译器环境下,其会将未初始化的指针所占内存空间的当前内容看成一个地址值,访问该指针,相当于去访问一个本不存在的位置上的本不存在的对象,如果这个位置本来有内容,那么找错误就非常的麻烦了。
 
  这里特别提一下  void* 指针。
  这是一种特殊的指针类型,可以用于存放任意对象的地址,一一对应。概括来说,void*  的视角来看内存空间也就仅仅是内存空间,没办法访问。
 
tip : 指针通常难以理解,即使是有经验的程序猿也常常因为调试指针引发的错误而备受折磨。
 参考书籍 《c++ primer》

以上是关于引用 与 指针的主要内容,如果未能解决你的问题,请参考以下文章

指针和引用与及指针常量和常量指针

引用与指针的区别

引用与指针的区别

指针与引用

引用 与 指针

为啥打印指针与打印取消引用的指针打印相同的东西?