【C++】指针和引用

引用:

  引用(reference)是为对象起了另外一个名字,引用类型应用(refers to)另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。

  一般初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和他的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。

指针:

  指针(pointer)是“指向(point to)”另外一种类型的符合类型。与引用类似,指针也实现了对其他对象的间接访问。然而指针与引用相比又有很多不同。

  其一。指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。

  其二,指针无须再定义时赋初值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。

  指针值:

  指针的值(即地址)应属于下列4种状态之一:

  1.  指向一个对象。

  2.  指向紧邻对象所占空间的下一个位置。

  3.  空指针,意味着指针没有指向任何对象。

  4.  无效指针,也就是上述情况之外的其他值。

  void* 指针:

    void*指针式一种特殊的指针类型,可用于存放任意对象的自地址。一个void*指针存放着一个地址,这一点和其他指针类似。不同的是,我们对该地址中到底是个什么类型对象并不了解:

double obj = 3.14, *pd = &obj;    

void *pv = &obj;    //obj可以是任意类型的对象
pv = pd;    //pv可以存放任意类型的指针


利用void*指针能做到的事儿比较有限:拿它和别的指针比较,作为函数的输入或输出、或者赋值给另外一个void*指针。不能直接操作void*指针所指向的对象,因为我们并不知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。

  概括来说,以void*的视角来看内存也就仅仅是内存空间,没办法访问内存中所存的对象。

指针和对象的区别:

  1.  指针可以为空,引用不能。

  2.  指针可以被重新赋值而引用在初始化后就不能改变绑定对象

  3.  指针有自己的内存地址,而引用没有,它仅仅是一个别名。 

  4.  引用必须初始化,指针不必。

  

参考资料:

  1.  http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in

  2.  《C++ Primer》(第五版)2.3  电子工业出版社

原文地址:https://www.cnblogs.com/vincently/p/4754549.html