引用:
引用(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 电子工业出版社