当前位置:编程学习 > C/C++ >>

引用是特殊指针

很多人把指针和引用看成两个完全不同的东西,引用只是个别名,不占用实际内存,只不过操作起来有点像指针.实际上引用就是一个指针,只不过是个特殊的指针,编译器对它做了些特殊的处理.它也占用内存.但由于编译器做了特殊处理,你不能用&去取址,用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;

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

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

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,