大家都知道,指针和引用,在访问对象时是非常方便的,而且不用产生额外的数据,对于参数的传递非常有用。但是指针和引用有着本质的区别,下面就简单的比较一下:
1)指针指向的是变量的地址,而引用只是该变量的一个别名,而且该变量可以有多个别名
具体的来说,指针访问变量时,直接通过地址,获得内存中存放的数据;但是引用和变量的标识符一样,通过标识符,获得变量的地址,然后通过地址获得内存中存放的数据。
因此引用和该变量其实指向的是同一块内存,对引用的操作就相当于对该变量的操作。
如:int a=0;int*p=&a;//将a的地址赋值给p int &b=a;int &c=a;//同一个变量可以有多个别名
cout<<&a<<endl;cout<<p<<endl;//输出的是a的地址 cout<<b<<endl;cout<<c<<endl;//输出的是a的值
2)指针的值可以改变,但是引用一旦被确定,就不能被改变
如:int a=0;int a1=1;
int*p=&a;
cout<<&a<<endl;//0012FF44
cout<<p<<endl;//0012FF44
p=&a1;
cout<<&a1<<endl;//0012FF40
cout<<p<<endl;//0012FF40
从上面就可以看出指着的值数可以改变的
3)指针可以赋空值,但是引用不能
4)指针可以不用初始化,但是引用必须初始化
如:int*p; int &a;//这个是错误的,必须初始化引用
5)const在指针和引用使用时情况不同
const的引用不能修改,但是常量指针可以可以被修改;
例如:
int a=10;
const int*p=&a;//常量指针,说明p指向的内容使不能被改变的(int* const p=&a;指针常量,表示p指针是不能改变的,即就是地址不能被改变)
const int& p1=a;
p1++;//这里将会出错,常引用的值是不能被改变的(如果这里是a++,是可以正常运行的)
int b=11;
p=&b;
这里为什么会出现这样的情况,其实很简单,如果不是常引用,那么别名和原来变量的名称相同,p1++,就相当于a++;但是现在是常引用,相当于p1这个别名是一个常量,但是a不是常量,a++是可以的,p1++就是不可以的。
6)引用是c++中特有的,在C语言中无法使用,因此在C语言中只能使用指针
7)指针和引用的空间大小不同
在使用sizeof求取数据大小时,指针的大小始终为4,但是引用的大小和引用的变量类型有关,sizeof是引用的变量类型的大小
8)对于函数的传参,一般的情况下传递对象的引用(对于对象,如果采用值传递,那么可能会有额外的操作)
9)引用相对于指针操作较为安全,但是指针直接操作内存,要谨慎使用。
给一个恰当的例子,来比喻指针和引用:例如你需要给一份申请书盖公章,指针就相当于,直接就相当于将存放公章的钥匙给了你,你自己去该章;引用只是说找到了拿公章的工作人员,由该工作人员给你盖章,具体的公章,钥匙在哪里,不清楚。
从上面的例子就可以看出,指针的操作范围广,但是不安全。