指针和引用各有用途,它们的区别在于:
(1)非空区别。任何情况下都不能使用指向空值的引用,即引用必须指向一个某个对象;而指针可以指空。
(2)合法性区别。使用引用之前不用检查它的合法性;指针则应该总是被测试,防止其为空。
(3)可修改区别。指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。
如:
int a=6;
int b=666;
int *p=new int;
int &r=a; //引用必须初始化
*p=a;
*p=b;(4)应用区别:
以下情况下使用指针:一是考虑到存在不指向任何对象的可能,二是你需要能够在不同的时刻指向不同的对象。
如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么就应该使用引用。
例子:
代码1:
#include <iostream>
using namespace std;
int main()
{
// int &r=new int; //报错,因为new int返回的是一个指针,而int &r返回的是一个引用
int *&r=new int; //等价于:int *p=new int; int &r=*p;r=3;
return 0;
}//若机器运行不正常的情况下(即机器的虚拟内存太小),无法创建新空间的情况下,那么new int会返回一个空指针。而引用不能为空,这种情况下使用int *&r=new int会导致一个无用的别名。而*读取一个无用的别名,并给其复制,将导致系统崩溃。
改进代码1:
#include <iostream>
using namespace std;
int main()
{//解决方案:要先判断指针不为空
int *p=new int;
if(p!=NULL)
{
int &r=*p;
r=3;
}
return 0;
}