引用是特殊指针

很多人把指针和引用看成两个完全不同的东西,引用只是个别名,不占用实际内存,只不过操作起来有点像指针.实际上引用就是一个指针,只不过是个特殊的指针,编译器对它做了些特殊的处理.它也占用内存.但由于编译器做了特殊处理,你不能用&去取址,用sizeof得到的值也不会是4或者8,而是它引用的对象的size大小.

其实我们想想也知道,如果引用真只是个别名,没啥其他意思.那真是叫饱了撑着搞个引用出来啊.直接用本来的名字不就行了,为啥用它的别名啊.所以引用实际上也只就是保存一个地址值在那.

要区分指针和引用,先说下常量指针和指针常量两个概念.

常量指针和指针常量

觉得看着这两术语非常让人晕,非常容易混淆.如果不去管它们,直接看英语就一目了然了.

常量指针(pointer to constant)

我觉得翻译成常量指针不太好,应该说指向常量的指针,虽然多了几个字但意思清晰了很多.不过其实也还不够准确的.先举个简单的例子吧.

const int num = 88;

const int* p = # //p就是一个常量指针,它指向常量num.常量指针非得指向常量吗?不一定

int no = 99;

const int* pp = &no; //pp也是个常量指针,但不指向常量.

常量指针只是表示指针指向的对象的值不能通过指针的方式去改变.

所以*p = 123和*pp = 123这样去赋值都不行.但no = 123这样赋值却可以.

指针常量(constant pointer)

其实我觉得这里翻译成常量指针才更好点,constant是在前面做修饰语的.

int num = 44;

int* const pp = # //这样写也可以int const* pp = #

指针常量表示指针指向了某个地方之后不能再指向其他地方了.

所以如果int no = 55;

pp = &no; //这里就会出错,pp不能再指向no了

我们平时定义啥常量时都是要马上初始化才行的.指针常量也一样.

int* pp; //这样是可以

int* const pp; //这样就不行了.不过你可以赋空值.比如int* const pp = 0;

我们只要看const是位于类型关键字左边还是右边.比如上面在int左边则是修饰指向的变量,如果在int右边则是修饰指针本身.

如果两个const同时用const int *const pp = #就是常量指针常量, 这名字真是超级难听.觉得还是叫指向常量的常量指针好点.

引用是特殊的指针常量

说了上面两个概念就很容易理解引用了.

引用实际上就是个指针常量(constant poniter).只不过是个特殊的指针常量.首先使用时语法就不一样

int num = 22;

int & rNum = num; //如果是const int num;那么引用就是const int& rNum = num;

另外就是引用时指向的对象必须是胡有效存在的,不能指向空的引用.除此之外和指针常量没啥区别了.一个样.据说用反编译看汇编代码,引用的最终实现就跟指针一样的.不过我还真没去验证过.

由于编译器做了特殊处理,引用就直接用名字,不用前面再加个星星*去解引用.这样用起来方便多了.所以凡是用到指针常量的地方都差不多可以用引用来代替了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值