从概率上讲,指针本质是有变量地址的的一个变量,在逻辑上是一个独立的。包括其所指向的地址的改变和其指向的地址的中所存放数据的改变。
而引用时一个别名,它在逻辑上并不独立,它存在依附性,所以引用必须初始化,(指针声明时候也最好初始化,但是不是必须,指针可以通过复制一个地址来更新其指向的地址空间。)而且引用在整个生命周期内不能被改变。
在c++中,它们经常用于函数参数传递,然而传递引用与传递指针本质上是不同的。
指针传递本质上是一个值传递的过程,它所传递的值是地址值。值在传递过程中被调函数的形参作为被调函数的局部变量处理(这就意味着,如果在被调函数中对传入的地址做了更新,将不影响调用函数中原指针的地址,更新的只是临时地址中的指向地址。)
而引用传递过程中,被调函数的形参虽然作为局部参数在堆栈中开辟了内存空间,但是任何对于引用参数的处理都会以一种寻址的方式操作到主调函数中的相关的实参变量,而对于指针传递的变量的参数将不影响到主调函数的相关变量,如果想通过指针参数改变主调函数中的相关变量,那就得用指针的引用或者指向指针的指针。
从编译的角度来看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名多对应的地址,指针变量在符号表上对应的地址为指针变量的地址值,而引用在符号表上对应的是地址值是引用对象的地址值,符号表生成后就不能改变,因此指针可以告便指向的对象,而引用不能。