从宏观上来讲:指针是C++的一种内置数据类型,有自己的存储地址,而引用不是一种数据类型它只是变量的别名。
至于值指针和引用的其他区别,都必须从编译器对引用的实现来讲:
从引用的定义
Int a = 5; int&j = a;
上面是一个简单的引用的定义,现在大部分编译器都是用指针来实现的,上述代码编译器会转化成如下:
Int a = 5; int *const j = &a;
从上述引用的定义可以看出引用和指针有两个区别:
1 引用必须进行初始化,因为引用是一个const指针;
2 引用无法绑定到一个空值上,因为无法对一个空值取地址(空值是右值);
从引用的使用:
j = 4;
因为j在编译器看来是一个const指针,因此编译器代码会转会为:
(*j) = 4;
从这里可以看出,对引用的任何操作都会作用在引用绑定的变量上。所以很多人提到的一些区别,比如使用sizeof,++。这是因为两者在使用时有本质的区别,一个是对指针的操作,一个是对引用绑定的绑定的变量的操作。
最后特意说一下,有的还提到引用是不占用内存。从上述的编译器引用的实现代码来看,引用的是占用的内存的因为定义了一个const指针,而这个指针是需要内存的。但是这个const指针并不是必须。
比如上述代码,int a = 5; int &j = a;j =4;与int a = 5; a =4;效果是一样的。所以可以通过编译器的优化,节省这个内存。这个完全取决于编译器的实现。ISO中并未规定引用需不需要占用内用。
总而言之,引用与直接使用变量相比,实现了一种形式上的方便,特别是在参数传递时,我们可以把引用传递理解为传递的是引用绑定的变量本身,而值传递传递的是参数的复制。