指针与引用区别

  • 非空区别:在任何情况下都不能使用指向空值的引用。引用必须总是指向某个对象。不存在指向空值的引用意味着引用的代码效率比使用指针的效率要高。
  • 合法性区别:使用引用前不需要检测它的合法性。指针总是被检测,防止其为空。
  • 可修改区别:指针可以被重新赋值以指向另一个不同对象,但是引用总是在初始化时被指定了绑定的变量,以后不能改变,也就是不能被重新赋值,但是其内容可以改变。
  • 应用区别:在以下情况下应该使用指针:1、存在不指向任何对象的可能(指针设置为空);2、需要能够在不同时刻指向不同对象(改变指针指向)。

这里的第三条要注意,虽然下面的代码不报错而且 b 的值也等于1,但只是看起来像而已,理解有误!是如果真的是改变引用的指向应该用 &b = c,但是这样是不被允许的。引用的赋值其实是指引用初始化时,它的引用对象只能是变量,并且,一旦它指定为某一个对象的引用后,就不能更改了。但是,可以用这个引用来改变它的对象的值,从而达到引用的目的——作为变量对象的别名。因为引用 b 初始化为 a,即b从此以后一直是 a 的引用,若想让 b 不再是 a 的引用而成为别的变量的引用那是不可能的

int a = 0;
int c = 1;
int& b = a;
b = c;
cout << b << endl;

所以代码中的 b = c,其实只表示 b = 1 的意思,也就是说 b 还是 a 的引用,但是 b 的值被赋成了1,a 的值也就是1了,如果在 b = c 的下一行加上 c = 10,就会发现 b 的值依旧是1,因为 b 始终都不是 c 的引用,两者没关系。

【另外】常引用所引用的对象的值是不能更改的,即上述代码中若将语句“int& b = a;”更改为“const int& b = a;”,在编译时就会出现错误了(注意是不能以 c 的方式来更改,比如 c = 3,但是可以用 a 来改,a = 3 是允许的)。指针同理:

int a = 0 , b = 1;
const int *p1 = &a;
*p1 = 1;    //不允许!因为const在*左侧表示值不能改
int* const p2 = &a;
p2 = &b;    //不允许!因为const在*右侧表示指向不能变

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值