c/c++指针详解(三)----指针和引用的比较

大家都知道,指针和引用,在访问对象时是非常方便的,而且不用产生额外的数据,对于参数的传递非常有用。但是指针和引用有着本质的区别,下面就简单的比较一下:

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)引用相对于指针操作较为安全,但是指针直接操作内存,要谨慎使用。


给一个恰当的例子,来比喻指针和引用:例如你需要给一份申请书盖公章,指针就相当于,直接就相当于将存放公章的钥匙给了你,你自己去该章;引用只是说找到了拿公章的工作人员,由该工作人员给你盖章,具体的公章,钥匙在哪里,不清楚。

从上面的例子就可以看出,指针的操作范围广,但是不安全。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值